【问题标题】:How do you use SinonJS for callback methods?你如何使用 SinonJS 的回调方法?
【发布时间】:2017-10-25 04:54:12
【问题描述】:

所以我有这个方法我想测试:

app.get('/test', exposeDb, function(req, res) {
    req.dbService.getUserByID( function(err, result) {
        if (result == 5) {
            res.statusCode = 200;
        }
        else {
            res.statusCode = 500;            
        }
    });
});

我正在尝试对它进行存根,以便 getUserByID 方法返回一个值,所以我这样做:

describe('Test', function() {
    beforeEach(function() {
        var getUserByIDStubE = sinon.stub(dbService, 'getUserByID').callsFake(() => {
            return 5;
        });
      });

    it('TESTSETSTETS', function(done) {        
        chai.request(server)
            .get('/test')
            .send({})
            .end(function (err, res) {
                res.should.have.status(200);
            });
            done();
    });
});

问题是,req.dbService.getUserByID 中的代码从未被调用,所以我无法检查“结果”是否等于 5 的逻辑。

如果我使用 console.log(req.dbService.getUserByID()),那确实返回了 5 的存根值。但我不知道它在回调上是如何工作的。

如何让它在我的示例中返回 5(然后检查 res.statusCode)?

提前致谢!

【问题讨论】:

    标签: javascript node.js unit-testing sinon chai


    【解决方案1】:

    看起来您的函数正在获取回调并使用结果调用它,而不是将结果作为存根返回。

    试试这样:

    sinon.stub(dbService, 'getUserByID').callsFake(cb => {
      cb(undefined, 5);
    });
    

    【讨论】:

      【解决方案2】:

      您不需要callsFake() 来获取getUserByID 来调用回调,这样您就可以测试res.statusCode 是否设置正确。您在此处需要的 sinon 函数是 stub.yields(),它是专门为此目的而制作的,它将使用您提供的参数调用传递给函数的第一个回调。

      var getUserByIDStubE = sinon.stub(dbService, 'getUserByID').yields([null, 5]);
      

      这将导致您传递给getUserByID 的回调被调用而没有错误,并且值为 5 或您要测试的任何值。

      【讨论】:

      • 最后一件事,如果我的方法接受一个参数,如“req.dbService.getUserByID(req.body, ...)”,如req.body,我将如何用Sinon stub这个参数?谢谢!我会投票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多