在使用node和mongo移动到TDD时

时间:2014-03-11 21:01:24

标签: node.js mongodb tdd mocha mongoskin

我想使用mocha按功能添加到我的程序功能,通过测试进行测试。

var assert = require('assert');
var mongoskin = require('mongoskin');

describe('basic database tests', function(){
  before(function(){
  });
  it('should have 3 users', function(done){
    var db = mongoskin.db('mongodb://localhost:27017/stuffTest', {safe:true});
    db.collection('users').find().toArray(function  (err,result){
      console.log(result.length);
      assert.equal(result.length,3);
    });
  });
});

它不起作用。无论我把测试内容放在哪里,我都会收到错误。通过这种安排,我得到错误:超过2000毫秒的超时

这是设置数据库的代码。我以前的开发方式是使用console.logs等来丢弃我的代码。此代码使用console.logs让我知道集合是否为空,然后如果是,则填充3条记录。

var mongoskin = require('mongoskin')
var db = mongoskin.db('mongodb://localhost:27017/stuffTest', {safe:true})
db.collection('users').find().toArray(function  (err,result){
  console.log(result.length)
})

db.collection('users', {strict:true}, function(err, collection) {
    if (err) {
        console.log("The 'users' collection doesn't exist. Creating it with sample data...");
        populateDB(users);
    }
});

var populateDB = function(huh) {
    console.log("Populating database...");
    var name= huh.name;
    var coll= huh.items;
    db.collection(name, function(err, collection) {
        collection.insert(coll, {safe:true}, function(err, result) {
          console.log(result.length);
        });
    });
}; 

var users = [];
users.name = 'users';
users.items= [
{name: 'tim', email: 'mckenna.tim@gmail.com', lists:[]},
{name: 'peri', email: 'perimckenna@gmail.com', lists:[]},
{name: 'tim2', email: 'mckt_jp@yahoo.com', lists:[]}
];

我该怎么写这个测试?此代码加上package.json和dropDb.js位于:https://github.com/mckennatim/tdd

1 个答案:

答案 0 :(得分:4)

您没有致电done。如果在异步测试中没有调用done,则可以保证超时。修改测试以在回调结束时调用done。像这样:

  it('should have 3 users', function(done){
    var db = mongoskin.db('mongodb://localhost:27017/stuffTest', {safe:true});
    db.collection('users').find().toArray(function  (err,result){
      console.log(result.length);
      assert.equal(result.length,3);
      done();
    });
  });