Jest: Zombar de métodos de classe estática

Criado em 5 jul. 2016  ·  3Comentários  ·  Fonte: facebook/jest

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?

Comentários muito úteis

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:

  • Importe as duas classes no topo.
  • Requer ambas as classes em 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.

Todos 3 comentários

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:

  • Importe as duas classes no topo.
  • Requer ambas as classes em 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.

Esta página foi útil?
0 / 5 - 0 avaliações