スイート内の複数のテストにわたる複数のアサーションで使用されるスパイがあります。
各テストでスパイがインターセプトするメソッドが呼び出されていないと見なされるように、スパイをクリアまたはリセットするにはどうすればよいですか?
たとえば、'does not run method'
のアサーションをtrueにする方法は?
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
})
})
Jestスパイには、モックと同じAPIがあります。モックのドキュメントは here であり、メソッドmockClear
を指定します。
mockFn.mock.calls
およびmockFn.mock.instances
配列に保存されているすべての情報をリセットします。多くの場合、これは2つのアサーション間のモックの使用データをクリーンアップするの場合に役立ちます。
(自分自身を強調)
したがって、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
})
})
@sdgluckの回答に感謝しますが、この回答に追加したいと思いますが、私の場合、同じスパイで複数のテストがあるため、各テストの後に明確な状態が必要でした。したがって、前のテストでmockClear()
を呼び出す代わりに、次のようにafterEach()
に移動しました。
afterEach(() => {
jest.clearAllMocks();
});
そして最後に、私のテストは以前のテストからスパイが呼び出されることなく正常に機能しています。
@ghiscodingの答えをさらに繰り返して、Jest構成でclearMocks
を指定できます。これは、各テスト間でjest.clearAllMocks()
を呼び出すことと同等です。
{
...
clearMocks: true,
...
}
ドキュメントを参照してください here 。