Simula un método de clase usando burla y sinon.

Estoy aprendiendo a hacer una prueba unitaria usando el módulo de nodo burla con sinon.

Usando solo una burla y una clase simple, puedo inyectar un simulacro con éxito. Sin embargo, me gustaría inyectar un talón de sinon en lugar de una clase simple, pero estoy teniendo muchos problemas con esto.

La clase que estoy tratando de burlar:

function LdapAuth(options) {} // The function that I want to mock. LdapAuth.prototype.authenticate = function (username, password, callback) {} 

Y aquí está el código que estoy usando actualmente en mi función beforeEach ():

  beforeEach(function() { ldapAuthMock = sinon.stub(LdapAuth.prototype, "authenticate", function(username, password, callback) {}); mockery.registerMock('ldapauth-fork', ldapAuthMock); mockery.enable(); }); afterEach(function () { ldapAuthMock.restre(); mockery.disable(); }); 

He intentado simular / rechazar la clase LdapAuth de varias maneras sin éxito y el código anterior es solo la última versión que no funciona.

Así que solo quiero saber cómo burlarse de esto con éxito usando sinon y burla.

Estas bibliotecas de simulación de nodos pueden ser bastante incómodas debido a la memoria caché del módulo de Node, la naturaleza dinámica de Javascript y su herencia prototípica.

Afortunadamente, Sinon también se encarga de modificar el objeto que intenta simular, así como de proporcionar una buena API para construir spys, submarinos y simulacros.

Aquí hay un pequeño ejemplo de cómo aplastaría el método de authenticate :

 // ldap-auth.js function LdapAuth(options) { } LdapAuth.prototype.authenticate = function (username, password, callback) { callback(null, 'original'); } module.exports = LdapAuth; 
 // test.js var sinon = require('sinon'); var assert = require('assert'); var LdapAuth = require('./ldap-auth'); describe('LdapAuth#authenticate(..)', function () { beforeEach(function() { this.authenticateStub = sinon // Replace the authenticate function .stub(LdapAuth.prototype, 'authenticate') // Make it invoke the callback with (null, 'stub') .yields(null, 'stub'); }); it('should invoke the stubbed function', function (done) { var ldap = new LdapAuth(); ldap.authenticate('user', 'pass', function (error, value) { assert.ifError(error); // Make sure the "returned" value is from our stub function assert.equal(value, 'stub'); // Call done because we are testing an asynchronous function done(); }); // You can also use some of Sinon's functions to verify that the stub was in fact invoked assert(this.authenticateStub.calledWith('user', 'pass')); }); afterEach(function () { this.authenticateStub.restre(); }); }); 

Espero que esto ayude.