如何使用Jasmine和NodeJs在回调函数内测试逻辑来测试Mongoose控制器

时间:2015-11-28 08:22:15

标签: node.js mongoose jasmine

在下面的函数中,我使用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实体放在响应中。

1 个答案:

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

});