web-dev-qa-db-ja.com

jest TypeScriptプロパティモックは型に存在しません

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()を使用すると同じエラーが発生します。

では、できればタイプセーフを失うことなく、どのようにエラーを取り除くことができますか?

9
ext

jest.spyOnmockImplementation などの関数と組み合わせて、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
});
13
Brian Adams