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函数?
您正在接收未定义的消息,因为request
variables在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是不必要的)。