Я тестирую функцию, которая внутри нее вызывает метод stati c из контроллера (класса es6), который возвращает результат выборки API. Поскольку я пишу модульное тестирование, а контроллер имеет свои собственные тесты, я хочу смоделировать (технически подделать) метод stati c из класса, чтобы дать мне разные типы ответов.
// Controller.js
class Controller {
static async fetchResults() {} // the method I want to fake
}
// func.js - the function I am writing the test for
const func = async (ctx) => {
const data = await Controller.fetchResults(ctx.req.url)
if (containsErrors(data)) ... // do some logic
return { ...data, ...otherStuff }
}
Эта попытка подделать static async fetchResults()
ничего не делает, и тест пытается вызвать метод fetchResults
исходного контроллера.
// func.test.js
describe('when data is successfuly fetched', () => {
jest.mock('./Controller.js', () => jest.fn().mockImplementation(() => ({
fetchResults: jest.fn(() => mockResponse),
});
it('returns correct information', async () => {
expect(await func(context)).toEqual({ ...mockResponse, ...otherStuff });
});
});
Эта следующая попытка выглядит как макет работает в некоторой степени, но возвращаемое значение равно undefined
, а не { ...mockResponse, ...otherStuff }
, что говорит о том, что весь класс вытаскивается, но fetchResults
не найден из-за того, что он является static
методом, а не метод экземпляра.
import Controller from './Controller.js'
describe('when data is successfuly fetched', () => {
Controller.mockImplementation(jest.fn(() => ({
fetchHotel: () => { ...mockResponse, ...otherStuff }
})
it('returns correct information', async () => {
expect(await func(context)).toEqual({ ...mockResponse, ...otherStuff });
});
});