2015-02-09 56 views
6

我正在學習使用sinon的節點模塊嘲笑進行單元測試。模擬使用嘲諷和sinon的類方法

僅使用嘲諷和普通類我能夠成功注入模擬。不過我想注入一個sinon stub而不是一個普通的類,但是我遇到了很多麻煩。

類我試圖嘲弄:

function LdapAuth(options) {} 

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

這裏是我目前使用在我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(); 
    }); 

/以各種方式對LdapAuth類進行存根沒有成功,上面的代碼只是最新的版本,不起作用。

所以我只是想知道如何使用sinon和嘲笑成功地嘲笑這一點。

回答

9

由於Node的模塊緩存,Javascript的動態特性以及它的原型繼承,這些節點模擬庫可能非常麻煩。

幸好Sinon還負責修改您嘗試模擬的對象,並提供一個很好的API來構建spys,subs和mocks。

這裏是我將如何存根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(); 
    }); 
}); 

我希望這有助於。

+1

如果你想存根構造函數呢? – 2017-03-01 17:49:26