web-dev-qa-db-ja.com

Jest-関数呼び出しのモック

関数呼び出しをモックしようとしていますが、その中の別の関数が一度呼び出されたことを期待しています。

myFunctions.test.js

import { resetModal } from '../myFunctions.js';

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    const clearSomethingInModal = jest.fn();
    resetCreationModal();
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})

myFunctions.js

export resetModal() {
  clearSomethingInModal()
}

ただし、Jestの出力では、呼び出されていないと表示されます。誰かがこれを行う最善の方法を提案できるなら、私は非常に感謝するでしょう。

23
matt-p

テストファイルのコンテキストでのみclearSomethingInModalをモックするため、アプローチは機能しません。したがって、myFunctions.jsclearSomethingInModalは元のままです。主なポイントは、myFunctions.jsで直接作成されたものをモックできないことです。あなたがモックできる唯一のものは:

  1. myFunctions.jsのようなimport clearSomethingInModal from 'clearSomethingInModal'にインポートするモジュール。
  2. テストから呼び出したときに関数に渡すコールバック。

これは、myFunctions.jsをブラックボックスと考える場合に意味があります。インポートや関数の引数など、入力内容を制御でき、出力結果をテストできます。ただし、ボックス内で発生することをテストすることはできません。

リスト内の2つのポイントを反映する2つの例を次に示します。

myFunctions.test.js

import { resetModal } from '../myFunctions.js';
import clearSomethingInModal from 'clearSomethingInModal';

jest.mock('clearSomethingInModal', () => jest.fn())

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    resetCreationModal();
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})

myFunctions.js

import clearSomethingInModal from 'clearSomethingInModal';

export resetModal() {
  clearSomethingInModal()
}

myFunctions.test.js

import { resetModal } from '../myFunctions.js';

describe('resetModal', () => {
  it('calls the clearSomethingInModal function', () => {
    const clearSomethingInModal = jest.fn();
    resetCreationModal(clearSomethingInModal);
    expect(clearSomethingInModal.mock.calls.length).toBe(1);
  })
})

myFunctions.js

export resetModal(clearSomethingInModal) {
  clearSomethingInModal()
}
30