【问题标题】:stub a function with callback, don't return promise存根带有回调的函数,不返回承诺
【发布时间】:2019-02-16 14:07:17
【问题描述】:

我有一个正在调用函数的服务,我正在为该服务编写一个测试,我需要在该服务中存根该函数,该函数具有回调而不是返回一个承诺。当我为此创建存根并给出虚拟返回时,它挂起,因为服务需要回调, 这是我的测试代码

describe('Testing Token Service', () => {
let _stub =null;
beforeEach(async()=>{
    _stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
  if(_stub){
    _stub.restore()
  }
})

it('testing function saveToken_mongo() ', (done) => {
    _stub.returns(Promise.resolve( {'status' : 'true'} ))
    token_service.saveToken_mongo({},function(err, data){
        console.log(err, data)
        done();
    })
    // done()
});   });

这是我正在为其编写测试的服务功能

Service.prototype.saveToken_mongo = function(token, callback){
var _token = new tModel( token ) ;
_token.save(function(err, data){
    if(err){
        callback(err, null);
        return ;
    }
    else{
        callback(null, {'status':true})
        return ;
    }  
}) }

我需要使用存根从该函数返回虚拟回调。

【问题讨论】:

    标签: node.js unit-testing testing mocha.js stub


    【解决方案1】:

    stub.returns 用于普通函数而不是回调。由于save是回调函数,我们可以使用yields

    _stub.yields(null, {'status' : 'true'});
    

    第一个参数是错误值,第二个参数是数据。

    作为参考:

    https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-

    【讨论】:

      【解决方案2】:

      有点棘手,你的回调是 saveToken_mongo 参数,

      没有测试但尝试:

       _stub.returns(function(err, data){callback(null, {'status':true}) });
      

      如果您收到回调错误,请告诉我,您可以尝试改用this.callback

      【讨论】:

      • 我已经尝试过这个,无论有没有 this.callback ,但没有成功。
      • 仍然存在同样的错误,它挂起,因为函数无法将其作为回调
      • 我认为通过在 _stub.returns 中添加任何内容将添加为该函数的返回,它不会作为该函数的参数添加。
      • 可以改服务吗?
      • 是的,我可以更改服务,但是如何更改我的问题得到解决,因为即使我更改服务,我也必须从模型中存根相同的功能,因为它添加到数据库,我必须将其存根以测试服务,并且不要真正添加到数据库中。
      【解决方案3】:

      经过研究,我得出结论,这个问题有两种解决方案。

      1)根据deerawan我们可以使用yield来替换函数的回调,像这样

      _stub.yields(null, {'status' : 'true'});
      

      更多详情https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-

      2) 使用 bluebird 承诺所有方法,这会将所有方法响应从回调更改为承诺,然后您可以使用 Promise.returns,这是代码

      var Model = conn.model( name , ModelSchema);
      var Promise = require('bluebird');
      Promise.promisifyAll(Model);
      Promise.promisifyAll(Model.prototype);
      module.exports = Model;
      

      现在您可以按如下方式使用测试

      let _stub = null;
      var tModel = require('./../app/models/tokens') ;
      beforeEach(async()=>{
          _stub = sinon.stub(tModel.prototype, "save")
      })
      afterEach(async()=>{
        if(_stub){
          _stub.restore()
        }
      })
      it('returns a Promise' ,async function(){
          _stub.returns(Promise.resolve( {'status' : 'true & false'} ));
          expect(token_service.saveToken_mongo({})).to.be.a("Promise")   
      })
      

      【讨论】:

        猜你喜欢
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2018-03-29
        相关资源
        最近更新 更多