web-dev-qa-db-ja.com

jestスパイの複数の呼び出しで複数の引数をチェックする方法は?

Reactコンポーネントに次の関数があります:

onUploadStart(file, xhr, formData) {
  formData.append('filename', file.name);
  formData.append('mimeType', file.type);
}

これは私のテストであり、少なくともスパイを呼び出すことができます:

const formData = { append: jest.fn() };
const file = { name: 'someFileName', type: 'someMimeType' };
eventHandlers.onUploadStart(file, null, formData);

expect(formData.append).toHaveBeenCalledWith(
  ['mimeType', 'someMimeType'],
  ['fileName', 'someFileName']
);

ただし、アサーションは機能していません。

Expected mock function to have been called with:
 [["mimeType", "someMimeType"], ["fileName", "someFileName"]]
But it was called with:
  ["mimeType", "someMimeType"], ["filename", "someFileName"]

toHaveBeenCalledWithを使用する正しい方法は何ですか?

24

私は複数の呼び出しを模擬し、この方法で引数を確認することができました:

expect(mockFn.mock.calls).toEqual([
  [arg1, arg2, ...], // First call
  [arg1, arg2, ...]  // Second call
]);

ここで、mockFnはモック関数名です。

63
Andi

Jest 23.0以降、.toHaveBeenNthCalledWith(nthCall, arg1, arg2, ....)があります https://facebook.github.io/jest/docs/en/expect.html#tohavebeennthcalledwithnthcall-arg1-arg2-

10
mpetla

署名は.toHaveBeenCalledWith(arg1, arg2, ...)です。ここで、arg1, arg2, ...は、single呼び出し( see )を意味します。

複数の呼び出しをテストする場合は、expectを複数回実行するだけです。

残念ながら、複数の呼び出しの順序をテストする方法はまだ見つかりません。

8
Enoah Netzach

toHaveBeenCalledWithをテストし、予想されるパラメーターの組み合わせごとに複数回テストすることもできます。

以下の例では、GAが3つの必須プラグインを含めて3回呼び出されたことをテストします。

  describe("requireDefaultGoogleAnalyticsPlugins", () => {
    it("requires defualt plugins", () => {
      requireDefaultGoogleAnalyticsPlugins(TRACKER);
      expect(GoogleAnalytics.analytics).toHaveBeenCalledTimes(3);
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        `${TRACKER}.require`, "linkid", "linkid.js"
      );
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        `${TRACKER}.require`, "displayfeatures"
      );
      expect(GoogleAnalytics.analytics).toHaveBeenCalledWith(
        `${TRACKER}.require`, "ec"
      );
    });
  });

OPの場合、これをテストできます

expect(formData.append).toHaveBeenCalledWith('mimeType', 'someMimeType');
expect(formData.append).toHaveBeenCalledWith('fileName', 'someFileName');
3
Lex

これも私にとってはうまくいきました...最初のページの読み込みはデフォルトの検索を行います...ユーザーインタラクションとクリック検索は別の検索を行います...検索プロセスが検索値を正しく拡張したことを確認する必要があります...

let model = {
        addressLine1: null,
        addressLine2: null,
        city: null,
        country: "US"};
let caModel = { ...model, country: "CA" };
const searchSpy = props.patientActions.searchPatient;
expect(searchSpy.mock.calls).toEqual([[{ ...model }], [{ ...caModel }]]);
0
swandog

Andiのソリューションに基づく別のソリューション。目的の呼び出しを選択し、引数の値を確認します。この例では、最初の呼び出しが選択されています:

expect(mockFn.mock.calls[0][0]).toEqual('first argument');
expect(mockFn.mock.calls[0][1]).toEqual('second argument');

このJestチートシートを確認することをお勧めします。

https://devhints.io/jest

0
Tonatio