我无法理解开玩笑是如何运作的。
考虑以下设置。 我有一个"依赖"像这样的模块:
dependency.js
function doSomething(y) {
console.log(y);
}
export {doSomething}
我有一个使用此依赖项的模块:
MyModule.js
import { doSomething } from './dependency';
let alreadyDid;
export default (x) => {
if (alreadyDid)
throw "error";
doSomething(x * 2);
alreadyDid = true;
}
我的测试文件如下所示(我使用require& jest.resetModules来重置模块"状态")
MyModule.test.js
jest.mock('./dependency', () => ({doSomething: jest.fn()}))
import { doSomething } from './dependency';
let myModuleDo;
describe('myModule', () => {
beforeEach(() => {
myModuleDo = require('./MyModule').default;
jest.resetModules();
});
it('calls the dependency with double the input', () => {
myModuleDo(2);
expect(doSomething).toBeCalledWith(4);
});
it('calls the dependency with double the input', () => {
myModuleDo(1);
expect(doSomething).toBeCalledWith(2);
});
});
问题是第二次测试总是失败,实际计数为4,好像它记得第一次调用。 当我在2之间切换时,我得到相反的结果(2而不是4)。
我尝试在afterEach中使用mockReset(),但是第二次测试失败了"没有调用"。
知道这里发生了什么?
更新 我意识到我需要更换" import" with require,以便在每次测试中获得新的模拟。
所以现在我很困惑 - 大多数开玩笑的例子都是" import"而不是"要求"。我几乎没有看到示例或模式解释我们需要使用require才能正确使用jest.fn()。
我缺少什么
答案 0 :(得分:0)
一种快速修复方法是将doSomething.mock.calls = [];
中的beforeEach
重设。
答案 1 :(得分:0)
尝试在每一个之前使用doSomething.mockClear()
。另外,您不必这样做:myModuleDo = require('./MyModule').default;
也不要使用jest.resetModules();
。另外,如果您希望模拟doSomething
为每个测试返回一个特定值,则可以将jest.fn()
设置为返回值e.g. jest.fn(() => 'some value here')