У меня есть ранее созданный файл .js
который высмеивает некоторые из наших функций для целей тестирования jest
. Я .ts
файл .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...'.
Я несколько раз стучал головой об этом, поэтому любая помощь была бы весьма признательна.
ОБНОВИТЬ
Хорошо, я добавил as any
конец первой строки моего файла Server.ts
так что теперь он выглядит так:
const Server = jest.genMockFromModule('../Server') as any;
Это избавилось от первого набора ошибок. Тем не менее, все еще сталкиваются с ошибками в моем файле .test.ts
.
ОБНОВЛЕНИЕ 2
Я заметил, что когда я запускаю настоящие тесты jest, все они проходят, хотя есть TypeErrors. Эти проблемы, похоже, не связаны с фактическими тестами.
Я исправил это сам. Способ, которым я работал, заключался в том, чтобы делать любые вызовы Server.getAsync
конкретному типу jest mock.
let getAsyncMock = Server.getAsync as jest.Mock
или же
let getAsyncMock = <jest.Mock>(Server.getAsync)
Это избавляет от моих ошибок.
После ответа @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>) as jest.Mock).mockClear();
});
});
Чтобы переопределить импорт, вы можете сделать это так:
import { AnalyticsApi } from "../../api/src";
jest.mock("../../api/src");
let listPolicies = jest.fn(() => {
return Promise.resolve();
});
(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
listPolicies,
}));
import axios from 'axios'; jest.mock('axios');
есть:import axios from 'axios'; jest.mock('axios');
(Server.getAsync as jest.Mock).mockImplementationOnce
под каждый модульный тест, и это работало.