在下面的函数中,我使用Mongoose从Mongo数据库中通过id检索实体。
var Recipe = require('models/recipe').model;
exports.findById = function(req, res) {
Recipe.findById(req.params.id, function(err, docs) {
if (err) {
console.error(err);
res.status(500).send(err);
}
res.json(docs);
});
}
我想使用Jasmine测试是否在引发错误时返回500并且我想测试是否在所有内容成功时将JSON实体放在响应中。
答案 0 :(得分:1)
我通过创建一个包含回调函数的闭包来解决它,优点是它也可以重用:
exports.jsonCallback = function(res) {
return function(err, docs) {
if (err) {
console.error(err);
res.status(500).send(err);
}
res.json(docs);
}
};
这让我可以在Jasmine测试中模拟关闭的响应:
var resMock = {
status : function(status) {
return {
send : function() {}
}
},
json : function(json) {}
};
var mongooseCallback = require('controllers/callbacks/mongooseCallback').jsonCallback(resMock);
describe("when a json callback has been called", function() {
it("should return status 500 when an error has been raised", function() {
var returnStatusMock = { send : function() {}};
var errorMessage = "errorMessage";
spyOn(resMock, 'status').and.returnValue(returnStatusMock);
spyOn(returnStatusMock, 'send');
mongooseCallback(errorMessage, null);
expect(resMock.status).toHaveBeenCalledWith(500);
expect(returnStatusMock.send).toHaveBeenCalledWith(errorMessage);
});
it("should return the corresponding document in a json format", function() {
spyOn(resMock, 'json');
var jsonString = "{ 'name' : 'value' }";
mongooseCallback(null, jsonString);
expect(resMock.json).toHaveBeenCalledWith(jsonString);
});
});