0

我目前是Sinon、Mocha、Supertest 的新手,并且正在编写测试。在我当前的场景中,我有验证我的“OTP”的身份验证库,并在验证后继续在回调函数中执行操作。

我无法模拟回调以返回 null 并继续测试其余代码。以下是我的代码片段:

Controller.js


var authy = require('authy')(sails.config.authy.token);
 authy.verify(req.param('aid'), req.param('oid'), function(err, response) {
  console.log(err);
  if (err) {
    return res.badRequest('verification failed.');
  }
....

我的测试是:

 var authy = require('authy')('token');



describe('Controller', function() {
  before(function() {
    var authyStub = sinon.stub(authy, 'verify');
    authyStub.callsArgWith(2, null, true);
  });

  it('creates a test user', function(done) {
    // This function will create a user again and again.
    this.timeout(15000);
    api.post('my_endpoint')
      .send({
        aid: 1,
        oid: 1
      })
      .expect(201, done);


  });
});

我基本上想在回调中调用 authy verify get a null 作为“err”,这样我就可以测试其余的代码。

任何帮助将不胜感激。谢谢

4

1 回答 1

0

问题是您authy在测试和代码中使用了对象的不同实例。请参阅此处authy github repo

在你的代码中你做

var authy = require('authy')(sails.config.authy.token);

在你的测试中

var authy = require('authy')('token');

所以你的存根通常很好,但它永远不会像这样工作,因为你的代码不使用你的存根。

一种出路是允许authy从外部注入控制器中的实例。像这样的东西:

function Controller(authy) {
    // instantiate authy if no argument passed

在你的测试中你可以做

describe('Controller', function() {
    before(function() {
        var authyStub = sinon.stub(authy, 'verify');
        authyStub.callsArgWith(2, null, true);
        // get a controller instance, however you do it
        // but pass in your stub explicitly
        ctrl = Controller(authyStub);
    });
});
于 2016-11-11T08:25:25.963 回答