使用JavaScript时,导入外部或内部库是如此普遍。有时为了在我们的项目中实现模块化和可重复性,有时是为了避免实施第三方已经开发的功能。
今天,我们将在测试代码时如何使用Jest Suite来模拟这些库。
首先,让我们假设我们有以下代码:
Maths.js
export const sum = (a, b) => a + b
export const substract = (a, b) => a - b;
app
import { sum, substract } from './math.mjs'
const sumResult = sum(2, 1);
const substractResult = substract(2, 1);
鉴于该代码,我们可以有两种情况:
- 模拟完整的“导入”,即完整库。
- 模拟只有一种方法,但保留另一个方法的原始代码
所以让我们看看每种情况:
嘲笑完整的图书馆
要模拟完整的库,我们只需要模拟其中一种方法(另一种将保留为undefined
),否则我们可以模拟所有方法。模拟技术是冷漠的,这取决于我们正在测试的。
// mock only one method
jest.mock('../math', () => ({
sum: jest.fn(),
}));
// mock only one method (with implementation)
jest.mock('../math', () => ({
sum: jest.fn().mockImplementation(() => '5'),
}));
// mock all methods
jest.mock('../math', () => ({
sum: jest.fn(),
substract: jest.fn(),
}));
仅嘲笑一种导入的方法
正如我们之前所说的,我们只能导入其中一种方法,并保留其余方法的原始实现
在下面的示例中,我们嘲笑substrack
方法,但请保留库其余部分的原始实现,在这种情况下,add
方法
jest.mock('../math', () => {
const originalMathLib = jest.requireActual('../math');
return {
...originalMathLib,
substract: jest.fn(),
};
});
在任何其他import
之前,将此代码包括在我们的测试文件的顶部非常重要。这些模拟必须是我们文件的第一行。