Я пытаюсь смоделировать конструктор класса ES6, используя jest v23.6.0 и babel 6.22.1.Разумеется, реальный код более сложен, чем приведенный ниже, но я сократил его до этого и все еще имею проблему.
У меня есть следующий класс:
StageComponent.js
export default class StageComponent {
constructor () {}
}
и следующий тестовый код:
import StageComponent from './StageComponent';
jest.mock('./StageComponent');
describe('StageComponent', () => {
it('should track constructor', () => {
let c = new StageComponent();
expect(StageComponent).toHaveBeenCalled();
});
});
Когда я проверяю это, я получаю
jest.fn() value must be a mock function or spy.
Received:
function: [Function StageComponent]
6 | let c = new StageComponent();
7 |
> 8 | expect(StageComponent).toHaveBeenCalled();
| ^
9 | });
10 | });
11 |
Независимо от того, что я пытаюсь, это похоже на макет() вызов ничего не делает.В противном случае Jest, кажется, работает нормально (например, я успешно заменил отдельные свойства на jest.fn ()), поэтому я не думаю, что это моя установка.Я что-то упускаю?Это, кажется, прямо из документов ...
РЕДАКТИРОВАТЬ: Фактический код для теста был:
import StageComponent from '@/StageComponent';
jest.mock('@/StageComponent');
...
и я изменил его для простоты, когдаЯ отправил эту скрытую проблему, которая была псевдонимом веб-пакета @
в пути.Он работает нормально, если я дам ему полный путь (включая .js в конце) как в import
, так и в mock()
.Итак, теперь вопрос в том, почему псевдоним не работает.(Также обратите внимание, что использование псевдонима в import
, а не в mock()
дает тот же результат, если это подсказка).
В конфигурации веб-пакета у меня есть alias
:
'@': resolve('src')
В jest config у меня есть это moduleNameMapper
:
'^@/(.*)$': '<rootDir>/src/$1'
А на самом деле, если я изменяю moduleNameMapper
, это выдает ошибки о том, что файл не найден, поэтому я подумаю, если это не таквообще не работает, было бы выбрасывать похожие ошибки, а не применять mock()