我是 Jest 的新手,我正在尝试用它来测试一个函数是否被调用。我注意到 mock.calls.length 并没有为每个测试重置,而是在累积。如何在每次测试之前将其设为 0?我不希望我的下一个测试取决于之前的结果。
我知道 Jest 中有 beforeEach - 我应该使用它吗?重置 mock.calls.length 的最佳方法是什么?谢谢你。
代码示例:
Sum.js:
import local from 'api/local';
export default {
addNumbers(a, b) {
if (a + b <= 10) {
local.getData();
}
return a + b;
},
};
Sum.test.js
import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');
// For current implementation, there is a difference
// if I put test 1 before test 2. I want it to be no difference
// test 1
test('should not to call local if sum is more than 10', () => {
expect(sum.addNumbers(5, 10)).toBe(15);
expect(local.getData.mock.calls.length).toBe(0);
});
// test 2
test('should call local if sum <= 10', () => {
expect(sum.addNumbers(1, 4)).toBe(5);
expect(local.getData.mock.calls.length).toBe(1);
});
我发现处理它的一种方法:在每次测试后清除模拟功能:
要添加到 Sum.test.js:
afterEach(() => {
local.getData.mockClear();
});
如果您想在每次测试后清除所有模拟函数,请使用 clearAllMocks
afterEach(() => {
jest.clearAllMocks();
});
正如@AlexEfremov 在评论中指出的那样。您可能希望在每次测试后使用 clearAllMocks
:
afterEach(() => {
jest.clearAllMocks();
});
请记住,这将清除您拥有的每个模拟函数的调用计数,但这可能是正确的方法。
您可以将 Jest 配置为在每次测试后重置或清除模拟,方法是将以下参数之一放入您的 jest.config.js
:
module.exports = {
resetMocks: true,
};
或者
module.exports = {
clearMocks: true,
};
这是文档:
https://jestjs.io/docs/en/configuration#resetmocks-boolean
resetMocks [boolean] 默认值:false 在每次测试之前自动重置模拟状态。相当于在每次测试之前调用 jest.resetAllMocks() 。这将导致任何模拟删除其虚假实现但不会恢复其初始实现。
https://jestjs.io/docs/configuration#clearmocks-boolean
clearMocks [boolean] 默认值:false 在每次测试之前自动清除模拟调用、实例和结果。相当于在每次测试之前调用 jest.clearAllMocks() 。这不会删除可能已提供的任何模拟实现。
resetAllMocks()
。作者似乎正在寻找一种清除调用计数器的方法,但是保持他们的模拟实现。同样,不是 100% 肯定,但这是我对 resetAllMocks 的理解。
jest.clearAllMocks();
实际上并没有为我清除所有的模拟。
afterEach(() => {
jest.restoreAllMocks();
});
帮我终于清除了开玩笑的间谍
每次测试后清除单个模拟函数,(这可能对点击此 url 的人有用)
import { methodName } from '../Path-to-file-with-methodName';
methodName.mockReturnValue(null );
describe('my component', ()=> {
afterEach(() => {
methodName.mockClear();
});
it('should call my method on mount', () => {
const wrapper = mount(<AComponent {...props} />);
expect(methodName).toHaveBeenCalledTimes(1);
})
it('should call my method on mount again', () => {
const wrapper = mount(<AComponent {...props} />);
expect(methodName).toHaveBeenCalledTimes(1);
})
});
您可以将 --resetMocks 选项添加到命令:npx jest --resetMocks
在每次测试之间自动重置模拟状态。相当于调用 jest.resetAllMocks()
local.mockClear()
时,它不起作用。jest.clearAllMocks()
?文档:jestjs.io/docs/en/jest-object#jestclearallmocksjest.clearAllMocks()
功能!我一直在将mockClear()
用于jest.mock
类,显然模拟没有以某种方式完全清除(模拟类中的间谍函数调用未清除)。这导致了非常烦人的对象实例差异错误:Compared values have no visual difference.
。jest.config.js
属性resetMocks: true
。