使用Mongoose进行单元测试

Ash*_*row 16 unit-testing mongoose mongodb node.js jasmine

我是Node.js,Mongoose的新手,并且在这个环境中进行测试.我在单独的文件中声明了以下架构.

Issue = mongoose.model("Issue", {
  identifier: String,
    date: String,
    url: String,    
    name: String,
    thumbnailURL: String
});
Run Code Online (Sandbox Code Playgroud)

然后我有这个方法,只返回IssueMongoDB集合中的所有实例.

function issues(request, response) {
  response.setHeader('Content-Type', 'text/json');

  Issue.find().sort('date').exec(function(error, items) {
    if (error) {
      response.send(403, {"status": "error", "error:": exception});
    }
    else {
      response.send(200, {"issues": items});
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

我已经通过实验得到了这一点,现在我想测试它,但我遇到了一个问题.如何在不设置MongoDB连接的情况下进行测试,我知道我可以设置所有这些内容,但这是一个集成测试.我想编写单元测试来测试以下内容:

  • 该函数是否正确设置了内容类型
  • 该功能是否按date字段排序
  • 发生错误时函数是否返回403?
  • ... 等等

我很想知道如何重构我现有的代码以使其更具单元可测试性.我尝试过创建第二个被调用的函数,接受responseItem架构对象作为参数,但感觉不对.有谁有更好的建议?

Emi*_* A. 8

Mongoose model(您的Issue)返回该Query对象的新实例.新query实例可以exec通过访问该方法prototype.(猫鼬3.8~)

如果要返回错误,可以写:

sinon.stub(mongoose.Query.prototype, "exec").yields({ name: "MongoError" }, null);
Run Code Online (Sandbox Code Playgroud)


Rud*_*vic 6

在我的节点代码中使用mocha和chaijs和sinonjs这样的方法对我有用:

var should = require('chai').should(),
sinon = require('sinon'),
mongoose = require('mongoose');

it('#issues() handles mongoosejs errors with 403 response code and a JSON error message', function (done) {

// mock request
var request = {};

// mock response
var response = {};
response.setHeader = function(header) {};
response.send = function (responseCode, jsonObject) {
    responseCode.should.equal(403);
    jsonObject.stats.should.equal('error');
    // add a test for "error:": exception
    done();
}

var mockFind = {
    sort: function(sortOrder) {
        return this;
    },
    exec: function (callback) {
        callback('Error');
    }
}

// stub the mongoose find() and return mock find 
mongoose.Model.find = sinon.stub().returns(mockFind);

// run function
issues(request, response);

});
Run Code Online (Sandbox Code Playgroud)


jmc*_*mcd 0

一个好的起点是:

  1. 研究有关存根和模拟以及测试替身的概念。
  2. 查看Sinon.js,它是 Node.JS 选择的 Mocking 框架