2012-10-10 11 views
12

He creado un contenedor de base de datos para mi aplicación, que se muestra a continuación. Para probarlo, obviamente me gustaría reemplazar la biblioteca de base de datos real. Podría crear una nueva clase que se burle del método query y atrape todas las entradas allí, pero usar sinon.js parece más apropiado, pero ¿cómo lo usaría?
¿Están las características mock o de sinon.js lo que debería estar usando?Tropezar y/o burlarse de una clase en sinon.js?

wrapper = (function() { 

    function wrapper() {} 

    wrapper.db = require("database"); 

    wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return wrapper; 

})(); 

Respuesta

6

Puede usar ambos para eso.

Mock tienen un comportamiento esperado que, si no se sigue correctamente, le dará un error.

A Stub es similar a un simulacro, pero sin el orden, por lo que puede llamar a sus métodos de la manera que desee. En mi experiencia casi nunca necesitas un simulacro.

Ambos sustituirán su método por un método vacío, o un cierre si pasa uno. Sería algo así:

stub = sinon.stub(wrapper , 'insertUser ', function() { return true; }); 

Luego se agrega el comportamiento de esperar para comprobar si se ha pasado.

Me gusta usar Jasmine con Jasmine-Sinon para verificar las pruebas.

+0

Oh. Entonces, ¿sería mejor andar el método 'insertUser' en lugar de la llamada' this.db' que 'insertUser' hace? – Industrial

+2

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 ... –

8

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.

+0

Enlaces actualizados a Jest: https://facebook.github.io/jest/docs/mock -functions.html http://facebook.github.io/jest/docs/jest-object.html#jestenableautomock – jwadsack

Cuestiones relacionadas