Mock Functions
ただ出力をテストするだけでなく、他のコードから間接的に呼び出された関数の振る舞いを見張ることができるので、モック関数は "スパイ"とも呼ばれます。 jest.fn()
関数でモック関数を作成できます。 実装が与えられなければ、モック関数は実行時にundefined
を返します。
メソッド #
リファレンス #
mockFn.mock.calls
#
モック関数に行われた全てのコールを示す配列を返します。個々のコールはそのコールに渡された引数の配列によって表されます。
例: f('arg1', 'arg2')
とf('arg3', 'arg4')
の形で2回呼ばれるモック関数f
は次のようなmock.calls
の配列を持ちます:
[ ['arg1', 'arg2'], ['arg3', 'arg4'], ];
mockFn.mock.instances
#
new
によりモック関数からインスタンス化されたオブジェクトのインスタンス全ての配列。
例: 2回インスタンス化されたモック関数は次のようなmock.instances
配列を持ちます:
const mockFn = jest.fn(); const a = new mockFn(); const b = new mockFn(); mockFn.mock.instances[0] === a; // true mockFn.mock.instances[1] === b; // true
mockFn.mockClear()
#
mockFn.mock.calls
と mockFn.mock.instances
の配列に格納されている全ての情報をリセットします。
2つのアサーションの間でモックの使用状況をクリーンアップしたいときにしばしば役立ちます。
mockClear
は mockFn.mock.calls
とmockFn.mock.instances
だけでなくmockFn.mock
も置き換えることに注意して下さい。 そのため古く無効なデータにアクセスしないように、 mockFn.mock
を他の変数に割り当てるのは一時的であっても、そうでなくても避けるべきです。
テスト間で自動的にモックをクリアするために clearMocks
の設定オプションが利用できます。
mockFn.mockReset()
#
いかなる最初に与えられた設定を含むモックに格納された全ての情報をリストアします。
モックを完全に初期状態に戻したいときに便利です。
mockReset
は mockFn.mock.calls
とmockFn.mock.instances
だけでなくmockFn.mock
も置き換えることに注意して下さい。 そのため古く無効なデータにアクセスしないように、 mockFn.mock
を他の変数に割り当てるのは一時的であっても、そうでなくても避けるべきです。
mockFn.mockRestore()
#
モックを削除して本来の実装に戻します。
あるテストケースでモック関数を利用して他のテストケースでは本物のモジュールに戻したいときに便利です。
mockFn.mockRestore
はjest.spyOn
によって作成されたモックに対してのみ動作することに注意して下さい。 このため手動で jest.fn()
を割り当てた場合は自分で復元作業を行わなければならないことに気をつけて下さい。
mockFn.mockImplementation(fn)
#
モックの実装として使用される関数を受け取ります。 モック自体はそれ自身から出てきたインスタンスと中に与えられた全てのコールをいまだ記録しています - 違いはモックがコールされたときに実装された関数も実行されることです。
注意: jest.fn(implementation)
は jest.fn().mockImplementation(implementation)
の省略形です。
例:
const mockFn = jest.fn().mockImplementation(scalar => 42 + scalar); // or: jest.fn(scalar => 42 + scalar); const a = mockFn(0); const b = mockFn(1); a === 42; // true b === 43; // true mockFn.mock.calls[0][0] === 0; // true mockFn.mock.calls[1][0] === 1; // true
mockImplementation
はクラスのコンストラクタをモックするのにも使用できます。
// SomeClass.js module.exports = class SomeClass { m(a, b) {} } // OtherModule.test.js jest.mock('./SomeClass'); // this happens automatically with automocking const SomeClass = require('./SomeClass') const mMock = jest.fn() SomeClass.mockImplementation(() => { return { m: mMock } }) const some = new SomeClass() some.m('a', 'b') console.log('Calls to m: ', mMock.mock.calls)
mockFn.mockImplementationOnce(fn)
#
モック関数への1回のコールに対する実装として使用される関数を受け取ります。関数への複数回のコールが異なる結果を返せるよう、チェーンすることができます。
var myMockFn = jest.fn() .mockImplementationOnce(cb => cb(null, true)) .mockImplementationOnce(cb => cb(null, false)); myMockFn((err, val) => console.log(val)); > true myMockFn((err, val) => console.log(val)); > false
モック関数がmockImplementationOnceによって定義された実装が全て使い切った時は、 呼び出された場合にjest.fn(() => defaultValue)
または .mockImplementation(() => defaultValue)
によって設定されたデフォルトの実装を実行します。
var myMockFn = jest.fn(() => 'default') .mockImplementationOnce(() => 'first call') .mockImplementationOnce(() => 'second call'); console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn()); > 'first call', 'second call', 'default', 'default'
mockFn.mockReturnThis()
#
下記の関数の糖衣構文です:
jest.fn(function() { return this; });
mockFn.mockReturnValue(value)
#
モック関数が呼ばれるたびに返す値を受け取ります。
const mock = jest.fn(); mock.mockReturnValue(42); mock(); // 42 mock.mockReturnValue(43); mock(); // 43
mockFn.mockReturnValueOnce(value)
#
モック関数を1回呼び出したときに返す値を受け取ります。 次のモック関数へのコールが異なる値を返せるようチェーンすることができます。 使用できる mockReturnValueOnce
の値が無い場合は、 mockReturnValue
で設定された値を返します。
const myMockFn = jest.fn() .mockReturnValue('default') .mockReturnValueOnce('first call') .mockReturnValueOnce('second call'); console.log(myMockFn(), myMockFn(), myMockFn(), myMockFn()); > 'first call', 'second call', 'default', 'default'