Node.js Sinon-如何存根嵌套函数?
抱歉,如果这是一个简单的问题,我对Node和Sinon比较陌生。我正在努力找出如何断言在Nodejs中调用了嵌套异步函数 我使用的是摩卡、柴、西农和request(),但我认为我缺少了一些关于存根部分的基本内容 my_app.js中的示例-Node.js Sinon-如何存根嵌套函数?,node.js,request,mocha.js,sinon,chai,Node.js,Request,Mocha.js,Sinon,Chai,抱歉,如果这是一个简单的问题,我对Node和Sinon比较陌生。我正在努力找出如何断言在Nodejs中调用了嵌套异步函数 我使用的是摩卡、柴、西农和request(),但我认为我缺少了一些关于存根部分的基本内容 my_app.js中的示例- var request = require('request'); function MyModule() { }; MyModule.prototype.getTicker = function(callback) { request('htt
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();
在测试内部。我试图取消对request的调用,并提供一些虚拟数据返回。但我在创建存根的行中不断收到一个错误“request is not defined”
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中的函数请求
关于如何做到这一点有什么想法吗?也许我也需要一个间谍(但怎么做?)或者是否有更好的方法来测试上述getTicker函数?您收到未定义的消息,因为
请求
变量在您的测试范围内是未知的。但是,即使您要更正此问题并将请求
库分配给该变量,您仍然会收到一个错误,即sinon requires在任何提供的对象上创建存根的方法
这样做的结果是,请求
函数本身不能被存根,因为它不存在于对象上,而是作为一个定义了其他方法的函数。因此,为了支持可测试性,最好不要直接在代码中使用请求
,而是使用其附加的方法然后可以被存根。例如:
my_app.js
MyModule.prototype.getTicker = function(callback) {
request.get('http://example.com/api/ticker', function(error, response) {
...
});
};
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);
});
my_test.js
MyModule.prototype.getTicker = function(callback) {
request.get('http://example.com/api/ticker', function(error, response) {
...
});
};
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);
});
(请注意,在存根是同步的情况下,异步运行mocha是不必要的)。好的,我没想过在这个问题上使用get方法。现在我想我还可以使用间谍来验证调用了回调。啊,是的,我可以验证调用了回调。但是我使用了一点不同的语法
mymodule.getTicker(回调)
请求.获取.应该.已经.被调用;
和请求.获取.应该.已经.被调用;
非常感谢!