primer lugar, me modifico su definición de clase un poco (nombre de la clase mayúsculas y fijar db asignación):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
Para derivadas La clase entera:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
va a crear una instancia de Wrapper donde cada método es un stub. sinon.spy
nos permitirá espiar la creación de instancias de clase.
Por lo que podría ejercer de esta manera:
// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;
// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;
(afirmaciones usar chai y sinon-chai)
acabo de decir "ejercerlo", porque este fragmento de código no es una prueba de la unidad real. El tema sujeto a la prueba realizará llamadas de creación de instancias y métodos.
Ahora, si quiere burlarse de una dependencia inyectado por require() -tales como db = require('database')
en su ejemplo-, podría intentar una herramienta de prueba como sea Jest (pero que no utilizan sinon) o sinonquire la que creé inspirado por Jest pero para usarlo con sinon además de su herramienta de prueba favorita (la mía es mocha). Internamente, sin solicitud usa la misma técnica que se muestra arriba para combinar sinon.spy
y sinon.createStubInstance
para indicar una clase.
Oh. Entonces, ¿sería mejor andar el método 'insertUser' en lugar de la llamada' this.db' que 'insertUser' hace? – Industrial
Depende de lo que está probando, pero si quiere probar si el insertUser está insertando en el DB que sería una prueba de integración y ningún tropezón le evitaría usar la lógica real con algunos en DB de memoria para "falsificar" un Oracle por ejemplo, si desea probar si se llama al insertUser cuando sea necesario, el método stubbing insertUser podría ser una forma de hacerlo ... –