javascript - example - sinon npm
Espiando a un constructor en javascript con sinon (3)
Estoy tratando de crear un espía en un constructor y ver si se llama, a continuación están mis pruebas. Estoy usando sinon-chai, por lo que la sintaxis es válida, pero ambas pruebas fallan.
var foo = function(arg) {
};
var bar = function(arg) {
var baz = new foo(arg);
};
it(''foo initialized inside of this test'', function() {
var spy = sinon.spy(foo);
new foo(''test'');
expect(spy).to.be.called;
expect(spy).to.be.calledWith(''test'');
});
it(''foo initialized by bar()'', function() {
var spy = sinon.spy(foo);
bar(''test'');
expect(spy).to.be.called;
expect(spy).to.be.calledWith(''test'');
});
El problema es que Sinon no sabe en qué referencia espiar, así que la solución es usar un objeto, es decir, sinon.spy(namespace, ''foo'')
o anular la referencia usted mismo foo = sinon.spy(foo)
.
En caso de que quiera usar esto en Node, la respuesta de @ stckvflw se puede adaptar asumiendo que conoce el espacio de nombres del constructor como @billy se menciona. Para las clases integradas de JS, probablemente tengas razón al suponer que viven en un global
.
Un ejemplo concreto que usa chai-spies
para congelar el objeto Date
(equivalente a crear un stub
con Sinon):
const moment = new Date();
chai.spy.on(global, ''Date'', () => moment);
Teniendo en cuenta que su constructor está vinculado a la "ventana", lo que significa que si abre la consola del desarrollador en su navegador, debería poder intuir un objeto utilizando la función / constructor relacionado como tal:
var temp = new FunctionName();
Si es así, el código de trabajo real podría ser:
var jamesBond = sinon.spy(window, ''FunctionName'');
var temp = new FunctionName(args);
expect(jamesBond.called).to.be.equal(true);