簡體   English   中英

Sinon - 如何存根嵌套函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM