簡體   English   中英

如何使用sinon.js存根鏈接函數

[英]How to stub chained functions using sinon.js

為了編寫我的測試,我在堆棧中使用mocha框架, Chai作為斷言庫, Sinon.JS用於模擬 ,存根和間諜。 假設我有一些鏈式函數,例如:

request
    .get(url)
    .on('error', (error) => {
        console.log(error);
    })
    .on('response', (res) => {
        console.log(res);
    })
    .pipe(fs.createWriteStream('log.txt'));

考慮到我想用必要的參數斷言他們的調用,最好的方法是什么?

這樣的結構:

requestStub = {
    get: function() {
        return this;
    },
    on:  function() {
       return this;
    }
    //...
};

不允許我斷言這些方法,如:

expect(requestStub.get).to.be.called;
expect(requestStub.on).to.be.calledWith('a', 'b');

stub的returns()方法的用法:

requestStub = {
        get: sinon.stub().returns(this),
        on:  sinon.stub().returns(this),
    };

不會返回該對象,並導致錯誤:

TypeError:無法調用未定義的方法'on'

請告訴我,我怎樣才能存根鏈接功能?

第一種方法對於存儲您的請求對象是正確的,但是,如果您想測試方法是否被調用和/或檢查調用它們時使用了哪些參數,也許您將更容易使用間諜。 這是關於如何使用它們的sinon-chai文檔

'use strict';
var proxyquire = require('proxyquire').noPreserveCache();

var chai = require('chai');

// Load Chai assertions
var expect = chai.expect;
var assert = chai.assert;
chai.should();
var sinon = require('sinon');
chai.use(require('sinon-chai'));


var routerStub = {
   get: function() {
        return this;
    },
    on:  function() {
        return this;
    }
}
var routerGetSpy;
var configStub={
    API:"http://test:9000"
}
var helperStub={

}
var reqStub = {
    url:"/languages",
    pipe: function(){
            return resStub
        }
}
var resStub={
    pipe: sinon.spy()
}
// require the index with our stubbed out modules
var Service = proxyquire('../../../src/gamehub/index', {
            'request': routerStub,
            '../config': configStub,
            '../utils/helper': helperStub
        });

describe('XXXX Servie API Router:', function() {

  describe('GET /api/yy/* will make request to yy service defined in config as "<service host>/api/* "' , function() {

    it('should verify that posts routes to post.controller.allPosts', function() {
        var get = sinon.spy(routerStub, 'get')
        Service(reqStub);
        expect(get.withArgs("http://test:9000/api/languages")).to.have.been.calledOnce;
    });
  });

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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