Jest: Burlarse de los métodos de clases estáticas

Creado en 5 jul. 2016  ·  3Comentarios  ·  Fuente: facebook/jest

Me encontré con un problema al intentar simular un método de clase estática en Jest. ¿Este comportamiento es compatible?

Publicación cruzada en http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

Tengo una prueba unitaria muy simple que se ve así:

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();
    });

});

Donde Helper se ve así:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

Y ApiWrapper se ve así:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help () es objeto de burla de Jest, así que '¡ayuda!' nunca se imprime, pero la expectativa en la prueba falla. Esto aún falla si reescribimos ApiWrapper para que sea solo un objeto simple de Javascript como tal:

export default {
    help: () => { console.log('help!'); }
}

Sin embargo, funciona si cambiamos las importaciones en la especificación (por lo que ApiWrapper se importa en beforeEach) y reescribimos ApiWrapper para que sea una clase Singleton, así:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

¿Qué tiene el comportamiento burlón de Jest que hace que esto suceda?

Comentario más útil

Jest restablece el registro del módulo en cada llamada a it . Necesita ApiWrapper en la parte superior y Helper adentro antes de cada uno, por lo que es probable que Helper reciba una copia diferente de ApiWrapper . Para solucionarlo puedes:

  • Importe ambas clases en la parte superior.
  • Requiere ambas clases en beforeEach

Explicación simplificada:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Avísame si eso no soluciona tu problema.

Todos 3 comentarios

La afirmación correcta debe ser toBeCalled . ¿Puedes probar eso?

Lo siento, eso es lo que quise decir. Escribí el ejemplo en Stackoverflow directamente.

Jest restablece el registro del módulo en cada llamada a it . Necesita ApiWrapper en la parte superior y Helper adentro antes de cada uno, por lo que es probable que Helper reciba una copia diferente de ApiWrapper . Para solucionarlo puedes:

  • Importe ambas clases en la parte superior.
  • Requiere ambas clases en beforeEach

Explicación simplificada:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Avísame si eso no soluciona tu problema.

¿Fue útil esta página
0 / 5 - 0 calificaciones