2015-02-09 11 views
6

Uczę się testu jednostkowego za pomocą kpina modułu węzła z sinon.Makiety metoda klasy za pomocą kpiny i sinona

Używam tylko kpiny i zwykłej klasy, jestem w stanie wstrzyknąć fałszywą próbę. Jednak chciałbym wstrzyknąć zatrzask sinona zamiast zwykłej klasy, ale mam z tym wiele kłopotów.

Klasa Próbuję mock:

function LdapAuth(options) {} 

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

A oto kod obecnie używam w mojej funkcji beforeEach():

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

    afterEach(function() { 
     ldapAuthMock.restore(); 
     mockery.disable(); 
    }); 

Próbowałem wyśmiewać/niedopuszczalne jest stosowanie klasy LdapAuth na różne sposoby, a powyższy kod jest tylko najnowszą wersją, która nie działa.

Po prostu chcę wiedzieć, jak wyśmiać to z powodzeniem za pomocą grzechu i szyderstwa.

Odpowiedz

9

Biblioteki te mogą być dość kłopotliwe ze względu na pamięć podręczną modułów Node, dynamiczną naturę JavaScript i jej prototypowe dziedziczenie.

Na szczęście Sinon dba również o modyfikowanie obiektu, który próbujesz kpić, a także zapewnia ładny interfejs API do tworzenia spacji, subs i mocks.

Oto mały przykład jak bym skrótową metody 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.restore(); 
    }); 
}); 

Mam nadzieję, że to pomaga.

+1

co, jeśli chcesz zatroszczyć się o konstruktora? –

Powiązane problemy