Node.js Sinon-如何存根嵌套函数?

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

抱歉,如果这是一个简单的问题,我对Node和Sinon比较陌生。我正在努力找出如何断言在Nodejs中调用了嵌套异步函数

我使用的是摩卡、柴、西农和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();
在测试内部。我试图取消对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(回调)
请求.获取.应该.已经.被调用;
请求.获取.应该.已经.被调用;
非常感谢!