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?
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:
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.
Comentario más útil
Jest restablece el registro del módulo en cada llamada a
it
. NecesitaApiWrapper
en la parte superior yHelper
adentro antes de cada uno, por lo que es probable que Helper reciba una copia diferente deApiWrapper
. Para solucionarlo puedes:beforeEach
Explicación simplificada:
Avísame si eso no soluciona tu problema.