在测试之间清除模拟

时间:2018-02-26 18:33:45

标签: javascript jestjs

我无法理解开玩笑是如何运作的。

考虑以下设置。 我有一个"依赖"像这样的模块:

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()。

我缺少什么

2 个答案:

答案 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')