【发布时间】:2017-09-24 12:01:03
【问题描述】:
我是使用 Mocha、Chai 和 Sinon 在 NodeJS 中进行单元测试的新手。我一直在尝试为 API 端点编写单元测试用例,并且正在努力测试是否在 Promise 解决方案中从 API 调用 res.status(200).send();。下面是代码:
controller.js - 有待单元测试的功能
const User = require("./user_model");
module.exports = {
getUserById(req, res) {
const { params: reqParams } = req,
{ userId } = reqParams;
User.findOne({ _id: userId })
.exec()
.then(function(userFromDb) {
res.status(200).send(); // unable to test if this is getting called.
})
.catch((err) => res.status(500).send());
}
};
test.js - 有单元测试
const sinon = require("sinon"),
User = require("./user_model"),
controller = require("../controller");
require("sinon-mongoose");
describe('users', function() {
it('getUserById', function() {
const validReqObj = {
params: {
userId: "123"
}
};
const mock = sinon.mock(User);
mock.expects("findOne").withArgs({ _id: validReqObj.params.userId })
.chain("exec")
.resolves({ _id: validReqObj.params.userId });
const validRes = {
status: function(statusCode) {
sinon.assert.match(statusCode, 200);
return {
send: function() {
}
};
}
};
controller.getUserById(validReqObj, validRes);
mock.restore();
mock.verify();
});
});
如你所见,我的测试做了两件事:
- 模拟猫鼬
findOne函数并测试findOne的承诺解析是否正常。 - 断言
res.status()被调用并带有 200 状态代码。
它不会测试res.status() 是否被调用。例如,如果我从 controller.js 中删除行 res.status(200).send();,测试仍然通过。
我尝试在res.status 上创建spy。它没有按预期工作。
【问题讨论】:
标签: node.js unit-testing mocha.js sinon chai