Tive um problema ao tentar simular um método de classe estática em Jest. Este comportamento é compatível?
Postado cruzado em http://stackoverflow.com/questions/38206478/mocking-methods-in-jest
Eu tenho um teste de unidade muito simples que se parece com este:
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();
});
});
Onde o Helper se parece com isto:
import ApiWrapper from '../services/api_wrapper'
class Helper {
help() {
ApiWrapper.help()
}
}
export default new Helper();
E o ApiWrapper se parece com isto:
class ApiWrapper {
static help () {
console.log('help!')
}
}
export default ApiWrapper;
ApiWrapper.help () é ridicularizado por Jest, então 'ajuda!' nunca é impresso, mas a expectativa no teste falha. Isso ainda falhará se reescrevermos ApiWrapper para ser apenas um objeto Javascript simples, como:
export default {
help: () => { console.log('help!'); }
}
Funciona, no entanto, se alterarmos as importações na especificação (então ApiWrapper é importado em beforeEach) e reescrever ApiWrapper para ser uma classe Singleton, assim:
class ApiWrapper {
help() {
console.log('help!');
}
}();
export default new ApiWrapper();
O que há no comportamento zombeteiro de Jest que faz isso acontecer?
A afirmação correta deve ser toBeCalled
. Você pode tentar isso?
Desculpe, foi isso que eu quis dizer. Digitei o exemplo diretamente no Stackoverflow.
Jest redefine o registro do módulo em cada chamada para it
. Você está exigindo ApiWrapper
na parte superior e Helper
dentro de beforeEach, então o Helper provavelmente receberá uma cópia diferente de ApiWrapper
. Para consertar, você pode:
beforeEach
Explicação simplificada:
var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.
Avise-me se isso não resolver o seu problema.
Comentários muito úteis
Jest redefine o registro do módulo em cada chamada para
it
. Você está exigindoApiWrapper
na parte superior eHelper
dentro de beforeEach, então o Helper provavelmente receberá uma cópia diferente deApiWrapper
. Para consertar, você pode:beforeEach
Explicação simplificada:
Avise-me se isso não resolver o seu problema.