Ошибки машинописи при использовании шутки

2

У меня есть ранее созданный файл .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. Эти проблемы, похоже, не связаны с фактическими тестами.

Теги:
unit-testing
jestjs
jest

3 ответа

8
Лучший ответ

Я исправил это сам. Способ, которым я работал, заключался в том, чтобы делать любые вызовы Server.getAsync конкретному типу jest mock.

let getAsyncMock = Server.getAsync as jest.Mock

или же

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

Это избавляет от моих ошибок.

  • 3
    Вы нашли способ сделать это с помощью импорта? import axios from 'axios'; jest.mock('axios'); есть: import axios from 'axios'; jest.mock('axios');
  • 0
    Потрясающий ответ. Мне нравилось (Server.getAsync as jest.Mock).mockImplementationOnce под каждый модульный тест, и это работало.
0

После ответа @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();
  });

});
0

Чтобы переопределить импорт, вы можете сделать это так:

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню