#jestjs
#jestjs
Вопрос:
Я использую jest-mock-extended и пытаюсь воспроизвести общедоступную функцию в интерфейсе класса, который был издевался.
Вот мой IApiService
export default interface IApiService {
send: (url: string) => Promise<any>;
}
Мой тест для класса homeService, который имеет только одну общедоступную функцию с именем start .
import { mock } from "jest-mock-extended";
import HomeService from "./homeService";
import IApiService from "../Api/interface";
describe("HomeService", () => {
let apiService: IApiService;
let service: HomeService;
beforeEach(() => {
apiService = mock<IApiService>();
service = new HomeService(apiService);
});
it("Should shit all over the place", () => {
const mock_fetch = jest.fn(() => Promise.resolve("response"));
apiService.send.mockReturnValue(mock_fetch);
service.start();
expect(mock_fetch).toBeCalled();
});
});
Я пытаюсь заставить метод отправки возвращать измененное значение, но ни одна из функций в mock, похоже, не работает так, как я пытаюсь их вызвать.
Комментарии:
1. Вы создаете
send
функцию для возврата функции, которая никогда не вызывается, если она не предназначена для этого. Вероятно, должно бытьapiService.send.mockReturnValue(Promise.resolve("response"))
2. Можете ли вы привести мне пример? функция отправки — это функция возврата? Я обновил свой пример кода, чтобы показать свой метод отправки в службе. Когда я пытаюсь использовать mockReturnValue, я получаю эту ошибку: свойство ‘mockReturnValue’ не существует для типа ‘(url: string) => Promise<any>’.
3. Я не использую эту библиотеку и не могу предоставить работоспособный пример. Вероятно, это должно быть именно то, что вы опубликовали, с исправлением, которое было предложено выше. В случае, если есть проблема с типом (она была там во время публикации, но не упоминалась),
apiService
ее необходимо ввести правильно, потому что в настоящее время она не вводится как Jest spy. Из того, что я вижу здесь github.com/marchaos /… , так и должно бытьlet apiService: MockProxy<IApiService>
.4. Спасибо, Эстус, я попробовал предложенное вами исправление, но оно всегда говорит, что свойство mockReturnValue не существует для типа ….. Также не видно, где send возвращает функцию, когда она просто возвращает обещание.
5. Но ошибка должна была быть до этого, потому что вы уже использовали mockReturnValue , верно? Из того, что я вижу, типа MockProxy должно быть достаточно, чтобы исправить это. Если это все еще не исправляет это, пожалуйста, укажите вашу текущую попытку и точное сообщение об ошибке.
Ответ №1:
Поскольку Jest spy API используется для mocked объекта, он должен быть правильно напечатан, как предложено в документации:
let apiService: MockProxy<IApiService>;
Это объединяет типы методов с типами Jest spy, send
тип — это что-то вроде:
((url: string) => Promise<any>) amp; jest.SpyInstance<Promise<any>>
Ожидается, что издевательская функция вернет обещание, а не функцию, которая возвращает обещание, поэтому ее следует издеваться как:
apiService.send.mockReturnValue(Promise.resolve("response"))
или
apiService.send.mockResolvedValue("response")