【发布时间】:2025-12-05 15:25:01
【问题描述】:
我在追查为什么一个 sinon 间谍没有被触发时遇到了麻烦。在下面的测试中,两个控制台语句都报告为 false,因此没有调用任何方法(以防出现错误)。
这是我的一个 mocha 测试通常的样子:
describe('Post Controller', function () {
var controller = require('../controllers/PostController'),
req = {
user: {
check_id: "00100",
access_id: "54876329"
}
};
beforeEach(function () {
res = {
send: sinon.spy(),
json: sinon.spy()
};
});
afterEach(function () {
res.send.reset();
});
describe('readAllPosts', function () {
it('should return an array of posts', function (done) {
controller.readAllPosts(req, res);
process.nextTick(function () {
console.log('send: ', res.send.called);
console.log('json: ', res.json.called);
assert(res.json.calledWith(sinon.match.array));
done();
});
});
});
});
PostContoller 中的readAllPosts 方法:
var postController = {
readAllPosts: function (req, res) {
PostModel.find(
{
access_id: req.user.access_id
},
function (err, results) {
if (err) {
res.send(404, err);
} else {
// res here is a spy
res.json(results);
}
}
);
}
};
最后是 PostModel 中的 find 方法:
Posts.find= function (conditions, cb) {
/* ... */
dbQuery(query, function (err, results) {
if (err) {
cb(err);
}
cb(null, results);
});
};
如果我以正常方式调用方法,它们会执行 find,返回预期的 Posts 数组。然而,res 间谍永远不会被执行。另外,如果我将控制器类中的方法更改为此
var postController = {
readAllPosts: function (req, res) {
res.json([{this:"that",and:"other"}]);
}
};
间谍功能 (res) 会触发。我知道正在调用发送到模型的回调,并且 res 对象在那里但没有被调用。我不认为这是一个间接问题(调用原始方法而不是 sinon 包装的方法),但我不确定问题出在哪里。
【问题讨论】:
标签: javascript unit-testing sinon