单元测试节点w / MongoDb - 等待Mongodb连接

时间:2016-03-10 04:13:24

标签: node.js mongodb unit-testing mocha

我是单位测试节点和mongodb的新手....我正在尝试测试getUsername(),但我得到TypeError: user.find is not a function。我相信这可能是一种竞争条件,db-init.js脚本在第一个it块运行之前没有及时与数据库建立连接。

为了清楚起见,测试之外的代码没有问题。在测试之外,一切都按预期工作。

有什么建议吗?

试验:

var api = require('../app/js/api');
var httpMocks = require('node-mocks-http');


var req;
var res;


describe('db calls', function() {
  beforeEach(function() {
    api.initDBcursor();
    req = httpMocks.createRequest({
      params: { username: "foo" }
    }); 
    res = httpMocks.createResponse();
  });

  it('should get username',
     function(done) {
       api.getUsername(req, res);
       console.log(res);
   });
});

api.js

var mongo = require('../data/db-init');

var user;

function initDBcursor() {
  user = mongo.collections.user;
}


function getUsername(req, res) {
  console.log(user);
  var document = user.find(req.params.username); //HERE IS WHERE IT ERRORS
  _returnApi(document, res);
}

users.js

User.prototype.find = function(user) {
  return this.collection.find(user).limit(1).next();
};

DB-init.js

var MongoClient = require('mongodb').MongoClient;
var User = require('./models/users');
var db;

var collections = {
  user: false //THIS SHOULD HAVE A VALUE FROM initCollections() BEFORE
              //BEFORE THE FIRST IT BLOCK RUNS       
};

function connect() {
  var dbURI = 'mongodb://web-app:web-app@localhost/web-app';
  return MongoClient.connect(dbURI)
    .then(function(_db) {
      db = _db;
      console.log(colors
        .bold('MongoDB default connection open to ' + dbURI));
      initCollections();
    })
    .catch(function(err) {
      console.log(colors
        .red(err));
    });
}

function initCollections() {
  collections.user = new User(db);
}

2 个答案:

答案 0 :(得分:1)

尝试通过<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".lActivity"> <ScrollView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView // enter code here /> </CrollView> <RelativeLayout android:layout_width="match_parent" android:layout_height="100dp" android:layout_alignParentBottom="true" android:background="#FFFFFF"> <Button> <Button> <Button> </RelativeLayout> </RelativeLayout> 函数中的done执行此操作,而不在before中创建连接,这将为每个测试用例构建新连接。以下是一些示例代码。

test.js

beforeEach

api.js

  before(function(done) {
    api.initDBcursor(done);
  });

DB-init.js

function initDBcursor(cb) {
  //user = mongo.collections.user;
  mongo.connect(cb);
}

答案 1 :(得分:0)

我得到了它的工作。在休息一下并清醒之后,我意识到我没有启动数据库。

感谢您提出建议,但重要的是我不要更改原始代码。通过自我规则,我永远不会更改代码库以适应测试。

此外,谷歌搜索和读取异步上的mocha文档后,我找到了一种让它在摩卡中等待的方法。这是一个快速而肮脏的解决方案,我在其工作的地方写道......

var api = require('../app/js/api');
var yo = require('../app/data/db-init');
var httpMocks = require('node-mocks-http');

 describe('db calls', function() {
  beforeEach(function(done) {
    this.timeout(0)

    yo.connect().then(function() {
      api.initDBcursor();
    });

    setTimeout(function() {
      done()
    }, 5000);

    req = httpMocks.createRequest({
      params: { username: "foo" }
    });
    res = httpMocks.createResponse();
  });

更新尝试后......我发现使用SuperTest和/或Chai Http将为您处理异步处理,从而减少了测试的代码库。但是,在缺点方面,您实际上将运行一个节点服务器,其速度会略微降低。