Sinon – 如何存根嵌套函数?

道歉,如果这是一个简单的问题,我是相对较新的节点和Sinon。 我努力想弄清楚如何断言在Nodejs中调用了一个嵌套的asynchronous函数。

我正在使用摩卡,柴,sinon和请求( https://github.com/request/request ),但认为我遗漏了一些基本的部分。

在my_app.js里面的例子 –

var request = require('request'); function MyModule() { }; MyModule.prototype.getTicker = function(callback) { request('http://example.com/api/ticker', function(error, response) { if (error) { callback(error); } else { callback(null, response); } }); }; exports.mymodule = new MyModule(); 

在testing里面。 我正在试图剔除请求并提供一些虚拟数据返回。 但我不断收到一个错误“请求未定义”在我创build存根的行上。

 var myApp = require('../my_app.js') ,assert = require("assert") ,chai = require('chai') ,sinon = require('sinon') ,expect = chai.expect; describe('mymodule object', function() { var mymodule = myApp.mymodule; before(function(done) { sinon.stub(request).yields(null, JSON.stringify({ price: '100 USD' })); done(); }); it('getTicker function should call request on example ticker', function(done) { mymodule.getTicker(function(error, result){ request.called.should.be.equal(true); done(); }); }); }); 

我知道我可以分配sinon.stub(objname,“funcname”)或sinon.stub(“funcname”),但那些只设置外部对象,我试图存根函数getTicker内的函数请求。

任何想法如何做到这一点? 也许我需要使用间谍(但如何?)或者有更好的方法来testing上述getTicker函数?

您正在接收未定义的消息,因为requestvariables在testing范围内未知。 但是,即使您要更正此问题并将request库分配给variables,仍然会收到错误,因为sinon需要任何提供的对象上的方法才能创build存根。

这样做的结果是request函数本身不能被存根,因为它不存在于一个对象上,而是作为其他方法被定义的函数。 因此,为了支持可testing性,最好放弃在你的代码中直接使用request ,而是使用其附加的方法,然后可以被桩住。 例如:

my_app.js

 MyModule.prototype.getTicker = function(callback) { request.get('http://example.com/api/ticker', function(error, response) { ... }); }; 

my_test.js

 var request = require('request'); before(function() { sinon.stub(request, 'get').yields(null, JSON.stringify({price: '100 USD'})); }); it('getTicker function should call request on example ticker', function() { mymodule.getTicker(); request.get.called.should.be.equal(true); }); 

(注意,当存根同步时,asynchronous运行mocha是不必要的)。