jest.fn()
を使用してモックを追加すると、通常、_.mock
_プロパティにアクセスして、呼び出しなどの詳細にアクセスできます。これは次のようなものです。
_test('not working', () => {
const foo = new Foo();
foo.addListener = jest.fn();
foo.func(); // will call addListener with a callback
const callback = foo.addListener.mock.calls[0][0];
expect(callback()).toEqual(1); // test the callback
});
_
プレーンなJavaScriptではなくTypeScriptでテストを実装すると、エラーが発生します。
エラーTS2339:プロパティ 'mock'はタイプ '(callback:()=> number)=> void'に存在しません。
any
にキャストすることでエラーを取り除くことができますが、確かにもっと良い方法があるはずです:
_const callback = (foo.addListener as any).mock.calls[0][0];
_
この単純なコードでは、jest.fn(fn => { callback = fn; });
を使用して引数を保存するようにモックを書き換えることができますが、foo.addListener.mockClear()
を使用すると同じエラーが発生します。
では、できればタイプセーフを失うことなく、どのようにエラーを取り除くことができますか?
jest.spyOn
mockImplementation
などの関数と組み合わせて、TypeScriptで型安全性を維持しながら関数をモックします。
class Foo {
addListener = (callback: () => number) => { }
func = () => {
this.addListener(() => 1);
}
}
test('working', () => {
const foo = new Foo();
const mockAddListener = jest.spyOn(foo, 'addListener'); // spy on foo.addListener
mockAddListener.mockImplementation(() => { }); // replace the implementation if desired
foo.func(); // will call addListener with a callback
const callback = mockAddListener.mock.calls[0][0];
expect(callback()).toEqual(1); // SUCCESS
});