用于使用mongoose在node.js上进行单元测试的结构

时间:2012-12-27 14:43:06

标签: javascript node.js nodeunit

我一直在使用node.js开发数月,但现在我正在开始一个新项目,我想知道如何构建应用程序。

谈论单元测试时,我的问题出现了。我将使用nodeunit编写单元测试。

此外,我正在使用express来定义我的REST路由。

我正在考虑编写我的代码来访问两个“单独”文件中的数据库(显然,它们会更多,但我只是想简化代码)。将有路线代码。

var mongoose = require('mongoose')
 , itemsService = require('./../../lib/services/items-service');

// GET '/items'
exports.list = function(req, res) {
    itemsService.findAll({
        start: req.query.start,
        size: req.query.size,
        cb: function(offers) {
            res.json(offers);
        }
   });  
  };

而且,正如我在那里使用的那样,项目服务仅用于访问数据层。我这样做是为了测试单元测试中的数据访问层。它会是这样的:

var mongoose = require('mongoose')
  , Item = require('./../mongoose-models').Item;

exports.findAll = function(options) {
    var query = Offer
        .find({});
    if (options.start && options.size) {
        query
            .limit(size)
            .skip(start)
    }
    query.exec(function(err, offers) {
        if (!err) {
                options.cb(offers);
            }
    })
};

这样我可以检查单元测试是否正常工作,我可以在任何地方使用这个代码。我不确定它是否正确完成的唯一方法是我传递回调函数以使用返回值的方式。

您怎么看?

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,很容易! 您可以使用单元测试模块,如mocha和节点自己的断言或should等其他断言。

作为示例模型的测试用例的示例:

var ItemService = require('../../lib/services/items-service');
var should = require('should');
var mongoose = require('mongoose');

// We need a database connection
mongoose.connect('mongodb://localhost/project-db-test');

// Now we write specs using the mocha BDD api
describe('ItemService', function() {

  describe('#findAll( options )', function() {

    it('"args.size" returns the correct length', function( done ) { // Async test, the lone argument is the complete callback
      var _size = Math.round(Math.random() * 420));
      ItemService.findAll({
        size : _size,
        cb : function( result ) {
          should.exist(result);
          result.length.should.equal(_size);
          // etc.

          done(); // We call async test complete method
        }
      }, 
    });


    it('does something else...', function() {

    });

  });

});

依此类推,令人作呕。

然后当你完成测试时 - 假设你$ npm install mocha' - 那么你只需运行$ ./node_modules/.bin/mocha$ mocha如果你使用了npm的-g标志。

取决于你想要的 rectal /详细信息。我一直被告知,并且发现它更容易:首先编写测试,以获得清晰的规范视角。 然后根据测试编写实现,任何额外的洞察力都是免费的。