[英]Sinon - how to stub nested function?
抱歉,如果這是一個簡單的問題,我對Node和Sinon來說相對較新。 我正在努力弄清楚如何斷言在Nodejs中調用嵌套的異步函數。
我正在使用mocha,chai,sinon和request( 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();
在測試里面。 我正在嘗試將請求的調用存根,並提供一些虛擬數據返回。 但是我在創建存根的行上不斷收到錯誤“請求未定義”。
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函數?
您收到未定義的消息,因為request
變量在測試范圍內是未知的。 但是,即使您要更正此問題並將request
庫分配給變量,您仍會收到錯誤,因為sinon需要在任何提供的對象上使用方法才能創建存根。
這樣做的結果是request
函數本身不能被存根,因為它不存在於對象上,而是作為定義其他方法的函數。 因此,為了支持可測試性,最好在代碼中直接使用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);
});
(注意,當存根是同步的時,不必異步運行mocha)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.