#jestjs #ts-jest
#jestjs #ts-jest
Вопрос:
Я использую ручной макет для издевательства над классом typescript, и я повторно реализую все его методы, и я хочу, чтобы jest автоматически отслеживал все его методы.
Ожидаемый результат Я хочу иметь возможность автоматически шпионить за всеми методами. означает, что каждый метод, который я определяю в макетном руководстве, я смогу шпионить за ним без необходимости использовать jest.fn()
для каждого из методов.
Фактический результат ошибка типа: не удается прочитать ‘вызовы’ свойств undefined
Код
api/services/user-service.ts
import User from "../../models/user";
export default class UserService {
getUser(): User{
return new User('testname', 'testName@tes.com');
}
}
api/ services/mocks/user-service.ts
import User from "../../models/user";
export default class UserService {
getUser(): User{
return new User('testname', 'testName@tes.com');
}
}
/tests/user-service.test.ts
import UserService from "../api/services/user-service";
import { mocked } from "ts-jest/utils";
jest.mock('../api/services/user-service');
it('Should get test user', ()=>{
const userService = new UserService();
expect(userService.getUser()).toEqual({name: 'testname', email: 'testName@tes.com'});
expect(mocked(userService).getUser.mock.calls.length).toBe(1);
})
/jest.config.js
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
roots: [
"<rootDir>"
],
testMatch: [
"**/__tests__/**/*.ts",
"**/?(*.) (spec|test).ts"
],
transform: {
"^. \.ts$": "ts-jest"
},
};
Редактировать :
Похоже, что у jest есть проблема с обработкой классов es6 и правильным импортом. Я не могу вызвать mockImplementation, просто выполнив это в __mock__
jest.genMockFromModule('../user-service').getUser.mockImplementation
Также пытается использовать mocked()
из ts-jest
я получаю ошибку Property 'playSoundFile' does not exist on type 'unknown'.ts(2339)
И, допустим, я пропускаю эту строку, jest не распознает экспорт по умолчанию должным образом, и я получаю
UserService_1.default is not a constructor
Комментарии:
1. Если вы хотите, чтобы его методы автоматически издевались, не издевайтесь над ним
__mocks__
. Эти макеты являются взаимоисключающими, и ручной макет не использует Jest-шпионов, поэтому getUser не является шпионом.2. @EstusFlask Разве я не могу использовать автоматический макет в `__mocks__`?
3. Они перестают быть автоматическими таким образом, потому что … они больше не автоматические. Смотрите jestjs.io/docs/en/es6-class-mocks . Автоматические и ручные макеты могут быть объединены с jestjs.io/docs/en /… . Какую проблему вы пытаетесь решить? Вы могли бы просто предоставить действительный макет с помощью Jest spies в
__mock__
.4. @EstusFlask Хорошо, поэтому я могу использовать createMockFromModule в
__mock__
, но как я могу имитировать реализацию его методов?5. Если
getUser
генерируется createMockFromModule, это будет Jest spy и, следовательно, иметь mockImplementation и т.д.