Jestモック関数の呼び出しをリセットする方法はすべてのテストの前にカウントします


87

Jestは初めてですが、関数が呼び出されたかどうかをテストするために使用しようとしています。mock.calls.lengthがすべてのテストでリセットされるのではなく、蓄積されていることに気づきました。すべてのテストの前にどうすれば0にすることができますか?次のテストが前の結果に依存することを望まない。

JestにはbeforeEachがあることを知っています-それを使用する必要がありますか?mock.calls.lengthをリセットする最良の方法は何ですか?ありがとうございました。

コード例:

Sum.js:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

回答:


141

私がそれを処理するために見つけた1つの方法:各テストの後にモック関数をクリアする:

Sum.test.jsに追加するには:

afterEach(() => {
  local.getData.mockClear();
});

各テストの後にすべてのモック関数をクリアしたい場合は、clearAllMocksを使用してください

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

モックされたすべてのオブジェクトのメソッドに対してそれを行う方法があるかどうか興味があります。試しlocal.mockClear()てみるとうまくいきません。
市民conn18年

27
使ってみましたjest.clearAllMocks()か?ドキュメント:jestjs.io/docs/en/jest-object#jestclearallmocks
Alex Efremov

@ AlexEfremov、jest.clearAllMocks()関数をありがとうございました!私はクラスに使用mockClear()してきましたがjest.mock、どうやらモックが完全にクリアされていなかったようです(モッククラス内のスパイ関数呼び出しはクリアされませんでした)。これにより、非常に厄介なオブジェクトインスタンスの違いエラーが発生しましたCompared values have no visual difference.
パトリック

この答えを強化するために、私は自分のjest.config.jsプロパティを更新しましたresetMocks: true
ケビン・アウン

22

@AlexEfremovがコメントで指摘したように。clearAllMocks各テストの後に使用することをお勧めします。

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

これにより、使用しているすべてのモック関数の呼び出し数がクリアされることに注意してください。ただし、これはおそらく正しい方法です。


8

これをjest.config.js:に入れることで、各テスト後にモックをリセットするようにJestを構成できます。

module.exports = {
  resetMocks: true,
};

この構成パラメーターのドキュメントは次のとおりです。https//jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [ブール値]

デフォルト:false

すべてのテストの前にモック状態を自動的にリセットします。各テストの前にjest.resetAllMocks()を呼び出すのと同じです。これにより、偽の実装が削除されたモックが作成されますが、最初の実装は復元されません。


3
ありがとうございました!これがデフォルト設定ではないのはなぜ私を本当に混乱させるの
ですか...–ランダムまたは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.