Jest шпионит за всеми методами класса es6 / typescript при ручном издевательстве над классом

#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 и т.д.