运行节点服务器中的Stubbing模块,用于测试边缘情况

时间:2016-01-18 22:54:39

标签: node.js unit-testing express mocking sinon

我是node及其测试生态系统的新手,所以如果这有点草率,请原谅我。

我正在尝试将一个设置为原型属性的函数存根。此函数Validate.prototype.isAllowed正在我的服务器代码中调用:

// Server
var router = require('express').Router();
var Validate = require('path/to/validator');
router.post('/jokes', function(req, res) {
  var validate = new Validate();
  if (!validate.isAllowed(req, 'jokes-create')) return res.end(403);
  res.end(200);
});

验证器代码如下所示:

// Validator
var validate = function() {};
validate.prototype.isAllowed = function(req, action) {
  return true; // make things simple
};
module.exports = validate;

我针对之前启动的服务器运行API测试。这是我的Mocha测试,我使用sinon来存根原型函数调用:

// Test
var Validate = require('path/to/validator');
var sinon = require('sinon');
var request = require('supertest-as-promised');
it('Fails with insufficient permissions', function(done) {
  sinon.stub(Validate.prototype, 'isAllowed', function() {
    return false;
  });
  request('www.example.com')
    .post('/jokes')
    .expect(403)
    .then(function() {
      Validate.prototype.isAllowed.restore();
      done();
    })
    .catch(done);
});

我发现永远不会调用存根函数,测试永远不会通过。问题在哪里?

我还尝试在存根中添加两个参数,但这似乎没有帮助。看起来像this question谈论同样的问题,但对于常规实例方法。此外,如果我将sinon.stub()位从测试移到服务器,则所需的存根生效。我觉得我的测试不会修补正在运行的服务器代码...

2 个答案:

答案 0 :(得分:0)

我认为在测试中你应该创建一个新的验证器,然后为该验证器创建一个存根,为原型创建一个存根。

试试这个:

it('Fails with insufficient permissions', function(done) {
  var validate = new Validate();
  sinon.stub(validate, 'isAllowed', function() {
    return false;
  });
  request('www.example.com')
    .post('/jokes')
    .expect(403)
    .then(function() {
      validate.isAllowed.restore();
      done();
    })
    .catch(done);
});

另外,我不熟悉.restore()函数,但由于isAllowed是一个函数,我相信调用

validate.isAllowed.restore();

不起作用。 (或者我错过了什么?)

答案 1 :(得分:0)

问题在于服务器和测试是在不同的过程中进行的。应该在测试过程中启动服务器以使存根工作。

这里有一个example self-contained Gist来说明这个想法。