如何使用Jasmine和NodeJstestingcallback函数中的逻辑来testingMongoose控制器

在下面的函数中,我使用Mongoose从MongoDB的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); }); } 

我想使用茉莉花来testing,如果我提出了一个错误,当我返回一个500,我想testing如果我把JSON实体上的一切都成功的响应。

我通过创build一个包含callback函数的闭包来解决这个问题,优点是它也是可重用的:

 exports.jsonCallback = function(res) { return function(err, docs) { if (err) { console.error(err); res.status(500).send(err); } res.json(docs); } }; 

这让我在茉莉花testing中嘲讽closures的回应:

 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); }); });