我是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()
位从测试移到服务器,则所需的存根生效。我觉得我的测试不会修补正在运行的服务器代码...
答案 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来说明这个想法。