2015-02-09 19 views
6

Tôi đang học cách kiểm tra đơn vị bằng cách sử dụng mô phỏng nút mô-đun với sinon.Giả sử một phương pháp lớp học sử dụng chế nhạo và sinon

Chỉ sử dụng chế độ nhạo báng và lớp đơn giản tôi có thể tiêm thành công mô hình. Tuy nhiên tôi muốn tiêm một cuống xoang thay vì một lớp học đơn giản nhưng tôi gặp rất nhiều rắc rối với điều này.

Lớp Tôi cố gắng để nhạo báng:

function LdapAuth(options) {} 

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

Và đây là đoạn code Tôi hiện đang sử dụng trong chức năng của tôi 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(); 
    }); 

Tôi đã cố gắng để nhạo báng/khai báo lớp LdapAuth theo nhiều cách khác nhau mà không thành công và mã ở trên chỉ là phiên bản mới nhất không hoạt động.

Vì vậy, tôi chỉ muốn biết cách chế nhạo thành công này bằng cách sử dụng tội lỗi và chế nhạo.

Trả lời

9

Các thư viện mô phỏng nút này có thể khá cồng kềnh vì bộ đệm mô-đun của Node, tính chất động của Javascript và đó là thừa kế nguyên mẫu.

May mắn thay, Sinon cũng chăm sóc sửa đổi đối tượng bạn đang cố gắng giả lập cũng như cung cấp API tốt để xây dựng spys, subs và mocks.

Dưới đây là một ví dụ nhỏ về cách tôi sẽ còn sơ khai phương pháp 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(); 
    }); 
}); 

Tôi hy vọng điều này sẽ giúp.

+1

điều gì sẽ xảy ra nếu bạn muốn tạo trình xây dựng? –

Các vấn đề liên quan