web-dev-qa-db-ja.com

Jestでスパイをリセットまたはクリアする方法は?

スイート内の複数のテストにわたる複数のアサーションで使用されるスパイがあります。

各テストでスパイがインターセプトするメソッドが呼び出されていないと見なされるように、スパイをクリアまたはリセットするにはどうすればよいですか?

たとえば、'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
  })
})
17
sdgluck

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
  })
})
19
sdgluck

@sdgluckの回答に感謝しますが、この回答に追加したいと思いますが、私の場合、同じスパイで複数のテストがあるため、各テストの後に明確な状態が必要でした。したがって、前のテストでmockClear()を呼び出す代わりに、次のようにafterEach()に移動しました。

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

そして最後に、私のテストは以前のテストからスパイが呼び出されることなく正常に機能しています。

11
ghiscoding

@ghiscodingの答えをさらに繰り返して、Jest構成でclearMocksを指定できます。これは、各テスト間でjest.clearAllMocks()を呼び出すことと同等です。

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

ドキュメントを参照してください here

1
James Irwin