用嘲讽和sinon嘲笑一个类的方法

我正在学习使用sinon的节点模块嘲讽进行unit testing。

只使用嘲笑和普通的类,我能够成功地注入一个模拟。 不过我想注入一个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类而没有成功,上面的代码只是最新的版本,不起作用。

所以我只想知道如何用颂歌和嘲弄来成功地嘲笑这个。

由于Node的模块caching,Javascript的dynamic特性以及它的原型inheritance,这些节点模仿库可能非常麻烦。

幸运的是,Sinon还负责修改你试图模拟的对象,并提供一个很好的API来构造spys,subs和mock。

下面是我如何存根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(); }); }); 

我希望这有帮助。