首页 文章

Sinon - 如何存根嵌套函数?

提问于
浏览
5

抱歉,如果这是一个简单的问题,我对Node和Sinon来说相对较新 . 我正在努力弄清楚如何断言在Nodejs中调用嵌套的异步函数 .

我正在使用摩卡,柴,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();

在测试里面 . 我正在尝试将请求的调用存根,并提供一些虚拟数据返回 . 但是我在创建存根的行上不断收到错误“请求未定义” .

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中存根函数请求 .

关于如何做到这一点的任何想法?也许我也需要使用 Spy (但是如何?)或者是否有更好的方法来测试上面的getTicker函数?

1 回答

  • 6

    您收到未定义的消息,因为 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) .

相关问题