我有一个间谍,它在一个套件的多个测试中的多个断言中使用。
如何清除或重置间谍,以便在每次测试中都认为间谍未拦截间谍方法?
例如,如何使'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
})
})
答案 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.calls
和mockFn.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();
});
最后,我的测试按应有的方式工作,而没有从先前的测试中调用间谍。