以前に作成した_.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があってもすべてテストに合格することに気付きました。これらの問題は、実際のテストに関連しているようには見えません。
これを自分で修正しました。動作するようにしたのは、Server.getAsync
特定のjestモックタイプ。
let getAsyncMock = Server.getAsync as jest.Mock
または
let getAsyncMock = <jest.Mock>(Server.getAsync)
これは私のエラーを取り除きます。
インポートをオーバーライドするには、次のようにします。
import { AnalyticsApi } from "../../api/src";
jest.mock("../../api/src");
let listPolicies = jest.fn(() => {
return Promise.resolve();
});
(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
listPolicies,
}));
@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();
});
});
まず、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()