【发布时间】:2016-01-18 22:54:38
【问题描述】:
我对@987654323@ 及其测试生态系统还很陌生,所以如果这有点草率,请原谅我。
我正在尝试存根设置为原型属性的函数。这个函数,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() 位从测试移动到服务器,所需的存根就会生效。我感觉我的测试不会修补正在运行的服务器代码...
【问题讨论】:
标签: node.js unit-testing express mocking sinon