Angular 8 с Jest - 'jasmine' не имеет экспортированного члена 'SpyObj'
У меня есть проект Angular CLI, в котором есть средство запуска тестов Karma по умолчанию. Я использовал это руководство, чтобы заменить Karma на Jest, и заметил, что некоторые тесты проходят некорректно.
Например, объявление переменной на тестовом уровне:
let mockObj: jasmine.SpyObj<MyClass>;
выдает ошибку:
error `"Namespace 'jasmine' has no exported member 'SpyObj'`
@angular-builders/jest: "^8.3.2"
jest: "^24.9.0"
jasmine-core: "3.5.0"
@types/jest: "^24.9.0"
@types/jasmine: "3.5.0"
@types/jasminewd2": "2.0.8"
1 ответ
Решение
Когда вы выбираете Jest, вы должны использовать шпионов и издевательств Jest вместо шпионов Jasmine. Или какую-нибудь другую тестовую двойную библиотеку вроде Sinon.
Пример фиктивного класса Jest
import SoundPlayer from './sound-player';
const mockPlaySoundFile = jest.fn();
jest.mock('./sound-player', () => {
return jest.fn().mockImplementation(() => {
return {playSoundFile: mockPlaySoundFile};
});
});
beforeEach(() => {
SoundPlayer.mockClear();
mockPlaySoundFile.mockClear();
});
it('The consumer should be able to call new() on SoundPlayer', () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
// Ensure constructor created the object:
expect(soundPlayerConsumer).toBeTruthy();
});
it('We can check if the consumer called the class constructor', () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
expect(SoundPlayer).toHaveBeenCalledTimes(1);
});
it('We can check if the consumer called a method on the class instance', () => {
const soundPlayerConsumer = new SoundPlayerConsumer();
const coolSoundFileName = 'song.mp3';
soundPlayerConsumer.playSomethingCool();
expect(mockPlaySoundFile.mock.calls[0][0]).toEqual(coolSoundFileName);
});