使用Jest时如何重置或清除间谍?

时间:2018-11-17 10:35:13

标签: javascript testing jestjs

我有一个间谍,它在一个套件的多个测试中的多个断言中使用。

如何清除或重置间谍,以便在每次测试中都认为间谍未拦截间谍方法?

例如,如何使'does not run method'中的期望为真?

const methods = {
  run: () => {}
}

const spy = jest.spyOn(methods, 'run')

describe('spy', () => {
  it('runs method', () => {
    methods.run()
    expect(spy).toHaveBeenCalled() //=> true
  })

  it('does not run method', () => {
    // how to make this true?
    expect(spy).not.toHaveBeenCalled() //=> false
  })
})

4 个答案:

答案 0 :(得分:8)

如果要恢复以前添加到间谍中的方法的原始行为,则可以使用mockRestore方法。

查看下面的示例:

class MyClass {
    get myBooleanMethod(): boolean {
        return true;
    }
}

const myObject = new MyClass();
const mockMyBooleanMethod = jest.spyOn(myObject, 'myBooleanMethod', 'get');
// mock myBooleanMethod to return false
mockMyBooleanMethod.mockReturnValue(false);
// restore myBooleanMethod to its original behavior
mockMyBooleanMethod.mockRestore();

答案 1 :(得分:5)

Jest间谍具有与模拟相同的API。模拟文档为here,并指定了一种方法mockClear

  

重置存储在mockFn.mock.callsmockFn.mock.instances数组中的所有信息。

     

当您要清理两个断言之间的模拟使用数据时,这通常很有用

(强调我自己)

因此,我们可以使用mockClear“重置”间谍。以您的示例为例:

const methods = {
  run: () => {}
}

const spy = jest.spyOn(methods, 'run')

describe('spy', () => {
  it('runs method', () => {
    methods.run()
    expect(spy).toHaveBeenCalled() //=> true
    /* clean up the spy so future assertions
       are unaffected by invocations of the method
       in this test */
    spy.mockClear()
  })

  it('does not run method', () => {
    expect(spy).not.toHaveBeenCalled() //=> true
  })
})

答案 2 :(得分:2)

进一步迭代@ghiscoding的答案,您可以在Jest配置中指定clearMocks,这等效于在每个测试之间调用jest.clearAllMocks()

{
...
    clearMocks: true,
...
}

请参阅文档here

答案 3 :(得分:1)

感谢@sdgluck的回答,尽管我想在这个问题上补充一点,因为我有多个使用同一间谍的测试,因此我希望在每次测试后都保持清晰的状态。因此,我没有像以前的测试那样调用mockClear(),而是将其移到afterEach()中,如下所示:

afterEach(() => {    
  jest.clearAllMocks();
});

最后,我的测试按应有的方式工作,而没有从先前的测试中调用间谍。