Mock.mockImplementation() не работает

У меня есть класс обслуживания

Service.js

class Service {
}
export default new Service();

И я пытаюсь обеспечить макетную реализацию для этого. Если я использую что-то вроде этого:

jest.mock('./Service', () => { ... my mock stuff });

Он работает отлично, однако я не могу получить доступ к любым переменным, объявленным вне макета, что немного ограничивает, так как я хотел бы перенастроить то, что возвращает mock и т.д.

Я попробовал это (вдохновленный этой другой статьей StackOverflow: Служба, издевавшаяся с причинами Jest " Модуль factory для jest.mock() не имеет права ссылаться на любые out- переменные области видимости ")

import service from './Service';

jest.mock('./Service', () => jest.fn);

service.mockImplementation(() => {
    return { ... mock stuff }
);

К сожалению, когда я пытаюсь запустить это, я получаю следующую ошибку:

TypeError: _Service2.default.mockImplementation is not a function

Ответ 1

Макет равен jest.fn. Вам нужно вызвать jest.fn, чтобы создать издеваемую функцию.

Итак, это:

jest.mock('./Service', () => jest.fn);

Должно быть:

jest.mock('./Service', () => jest.fn());

Ответ 2

Вам нужно сохранить свой издеваемый компонент в переменной с именем, предваряемым "mock", и убедиться, что вы возвращаете объект со свойством по умолчанию при импорте своей службы из значения по умолчанию в файл "main.js".

// Service.js
class Service {
}
export default new Service();

// main.test.js (main.js contains "import Service from './Service';")

const mockService = () => jest.fn();

jest.mock('./Service', () => {
    return {
        default: mockService
    }
});

Ответ 3

У меня была та же проблема, что и у @Janos, другие ответы тоже не помогли. Вы могли бы сделать две вещи:

1/Если вам нужно смоделировать только функцию из Сервиса, в вашем тестовом файле:

import service from './Service';

jest.mock('./Service', () => jest.fn());

service.yourFunction = jest.fn(() => { /*your mock*/ })

2/Если вам нужно смоделировать весь модуль:

Скажем, ваш service.js находится в javascript/utils, создайте javascript/utils/__ mocks__ и внутри него создайте файл service.js, после чего вы можете смоделировать весь класс в этом файле, например:

const myObj = {foo: "bar"}

const myFunction1 = jest.fn(() => { return Promise.resolve(myObj) })

const  myFunction2 = ...

module.exports = {
  myFunction1,
  myFunction2
}

тогда в вашем тестовом файле вы просто добавляете:

jest.mock('./javascript/utils/service')

Функции, экспортированные из mockfile, будут проверены при выполнении вашего тестового файла.