Я столкнулся с проблемой, пытаясь имитировать статический метод класса в Jest. Поддерживается ли такое поведение?
Перекрестно размещено на http://stackoverflow.com/questions/38206478/mocking-methods-in-jest
У меня есть очень простой модульный тест, который выглядит так:
import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')
describe('Helper', () => {
let Helper;
beforeEach(() => {
Helper = require('../helper').default;
});
it('calls the Api Wrapper', () => {
Helper.help()
expect(ApiWrapper.help).toHaveBeenCalled();
});
});
Где Helper выглядит так:
import ApiWrapper from '../services/api_wrapper'
class Helper {
help() {
ApiWrapper.help()
}
}
export default new Helper();
А ApiWrapper выглядит так:
class ApiWrapper {
static help () {
console.log('help!')
}
}
export default ApiWrapper;
Jest издевается над ApiWrapper.help (), так что «помогите!» никогда не печатается, но ожидания в тесте не оправдываются. Это все равно не удастся, если мы перепишем ApiWrapper, чтобы он был простым объектом Javascript, например таким:
export default {
help: () => { console.log('help!'); }
}
Однако это сработает, если мы изменим импорт в спецификации (так, чтобы ApiWrapper был импортирован в beforeEach), и перепишем ApiWrapper как класс Singleton, например:
class ApiWrapper {
help() {
console.log('help!');
}
}();
export default new ApiWrapper();
Что в насмешливом поведении Джеста заставляет это происходить?
Правильное утверждение должно быть toBeCalled
. Вы можете это попробовать?
Простите, я это имел в виду. Я набрал пример непосредственно в Stackoverflow.
Jest сбрасывает реестр модуля при каждом вызове до it
. Вам требуется ApiWrapper
сверху и Helper
внутри перед каждым, поэтому Helper, вероятно, получит другую копию ApiWrapper
. Чтобы исправить это, вы можете:
beforeEach
Упрощенное объяснение:
var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.
Сообщите мне, если это не решит вашу проблему.
Самый полезный комментарий
Jest сбрасывает реестр модуля при каждом вызове до
it
. Вам требуетсяApiWrapper
сверху иHelper
внутри перед каждым, поэтому Helper, вероятно, получит другую копиюApiWrapper
. Чтобы исправить это, вы можете:beforeEach
Упрощенное объяснение:
Сообщите мне, если это не решит вашу проблему.