我是单位测试节点和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);
}
答案 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将为您处理异步处理,从而减少了测试的代码库。但是,在缺点方面,您实际上将运行一个节点服务器,其速度会略微降低。