web-dev-qa-db-ja.com

jest mocksを使用する場合のタイプスクリプトエラー

以前に作成した_.js_ファイルがあり、これはjestテストの目的のために関数の一部をモックアップしています。私はそれを_.ts_ファイルに移行しています:

Server.ts

_const Server = jest.genMockFromModule('../Server');

Server.getAsync = Server.default.getAsync;
// other REST-ful functions here

export default Server;
_

次のエラーが表示されます。

プロパティ「getAsync」はタイプ「{}」に存在しません

プロパティ 'default'はタイプ '{}'に存在しません

次に、対応するテストファイルで:

MyComponent.test.ts

_import Server from 'path/to/Server';

jest.mock('path/to/Server');

const dispatchMock = jest.fn();
const getStateMock = jest.fn();

describe('MyComponent.someFunction', () => {
    beforeEach(() => {
        jest.resetAllMocks();
    });

    it('Does the right stuff', () => {
        Server.getAsync.mockReturnValueOnce(Promise.resolve([{ key: 'value' }]));
        dispatchMock.mockImplementationOnce((promise) => promise);
        dispatchMock.mockImplementationOnce();

        return someFunction()(dispatchMock)
            .then(() => {
                expect(Server.getAsync).toHaveBeenCalledTimes(1);
                expect(Server.getAsync.mock.calls[0][0]).toBe('something');
            });
    });
});
_

dispatchMock.mockImplementationOnce()でエラーが発生します

1つの引数が必要ですが、0になりました。(メソッド)jest.MockInstance <{}>。mockImplementationOnce(fn:(... args:any [])=> any):jest.Mock <{}>

... _Server.getAsync.mockReturnValueOnce_で

プロパティ 'mockReturnValueOnce'はタイプ '(url:string、baseRoute ?: string | null、loadingGenerator ?:(isLoading:boolean)=> {type:strin ...'に存在しません。

...および_Server.getAsync.mock_

プロパティ 'mock'はタイプ '(url:string、baseRoute ?: string | null、loadingGenerator ?:(isLoading:boolean)=> {type:strin ...'に存在しません。

私はしばらくこれに頭を打ち続けてきたので、どんな助けも大歓迎です。

[〜#〜] update [〜#〜]

さて、_as any_ファイルの最初の行の最後に_Server.ts_を追加したので、次のようになります。

_const Server = jest.genMockFromModule('../Server') as any;
_

これにより、エラーの最初のセットが取り除かれました。それでも、まだ_.test.ts_ファイルのエラーに直面しています。

更新2

実際のjestテストを実行すると、TypeErrorがあってもすべてテストに合格することに気付きました。これらの問題は、実際のテストに関連しているようには見えません。

5
noblerare

これを自分で修正しました。動作するようにしたのは、Server.getAsync特定のjestモックタイプ。

let getAsyncMock = Server.getAsync as jest.Mock

または

let getAsyncMock = <jest.Mock>(Server.getAsync)

これは私のエラーを取り除きます。

20
noblerare

インポートをオーバーライドするには、次のようにします。

import { AnalyticsApi } from "../../api/src";

jest.mock("../../api/src");

let listPolicies = jest.fn(() => {
  return Promise.resolve();
});

(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
  listPolicies,
}));
2
Sean Lafferty

@nobleare応答に続いて...良い更新は、モック実装をbeforeAllにラップし、beforeEachブロックにクリアすることです:

import { AnalyticsApi } from "../../api/src";

jest.mock("../../api/src");

describe('...', () => {

  beforeAll(() => {
    (AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
      listPolicies: jest.fn().mockResolvedValue('promiseValue')
    }));
  });

  beforeEach(() => {
    (AnalyticsApi as jest.Mock<AnalyticsApi>).mockClear();
  });

});
2
iarroyo

まず、genMockFromModuleのモックを作成するServerを使用しているため、jest.mock('path/to/Server');を呼び出す必要はありません。

次に、_Server.getAsync = Server.default.getAsync;_を実行して何を達成しようとしていますか?必要なことは、getAsyncを不要なレベルに移動することだけです。単にjest.genMockFromModule('../Server').default;を呼び出すことができます;

dispatchMock.mockImplementationOnce()は、ここに渡されるプロミスが必要だと言ったため、そのエラーをスローしています:dispatchMock.mockImplementationOnce((promise) => promise);

_Server.getAsync.mockReturnValueOnce_および_Server.getAsync.mock_の場合、他の回答が示唆するように型をキャストする代わりに、実際にmockedを使用する必要があります。

例:mocked(Server.getAsync).mockReturnValueOnce()

0