[英]Writing unit tests with DB connections/drivers with nodeunit
我正在嘗試使用nodeunit為我的簡單數據庫層SimpleDbLayer編寫一組測試單元。 我發現這很困難。
問題:
1)我想一次連接到數據庫,並使用該連接。 我不能真正使用setUp和tearDown,因為它們分別在每次測試之前和之后運行。 作為“解決方案”,我在范圍內使用模塊范圍的變量(請參見下面的代碼)
2)我的簡單數據庫層有幾個數據庫驅動程序。 MongoMixin只是其中之一-我正在開發MariaMixin和PostgresMixin。 理想情況下,我將為每個驅動程序運行一次這些測試,以查看它們是否有效。 有沒有一種簡便的好方法?
3)我遇到的情況是我的測試代碼有誤,而我得到的只是關於test.done的投訴。 在這里我需要注意一些技巧嗎?
4)我做錯什么了嗎? (請參見代碼)
var
dummy
, declare = require('simpledeclare')
, SimpleDbLayer = require('./SimpleDbLayer')
, MongoMixin = require('./MongoMixin.js')
, mw = require('mongowrapper')
, async = require('async')
;
var db, layer;
exports.createLayer = {
databaseConnect: function( test ){
mw.connect('mongodb://localhost/hotplate', {}, function( err, returnedDb ){
test.ifError( err );
db = returnedDb;
test.done( null );
});
},
makeLayer: function( test ){
var C = declare( [ SimpleDbLayer, MongoMixin ] );
layer = new C( 'test', { name: true, surname: true, age: true }, db );
test.ok( layer );
test.done();
},
deleteAll: function( test ){
layer.delete( { }, { multi: true }, function( err, howmany ){
test.ifError( err );
test.done();
});
},
insert: function( test ){
var people = [
{ name: 'Chiara', surname: 'Mobily', age: 24 },
{ name: 'Tony', surname: 'Mobily', age: 37 },
{ name: 'Sara', surname: 'Connor', age: 14 },
{ name: 'Daniela', surname: 'Mobily', age: 64 },
];
returnedPeople = [];
var functions = [];
// Populate the database
people.forEach( function( person ){
functions.push( function( done ){
layer.insert( person, { returnRecord: true }, function( err, person ){
test.ifError( err );
returnedPeople.push( person );
done( null );
})
})
})
async.series( functions, function( err, res ){
test.ifError( err );
test.done();
});
},
databaseDisconnect: function( test ){
db.close();
test.done();
},
}
回答我自己。 解決方案很簡單:對於每個驅動程序,這是test.js文件:
var driver = require('./ specificDriver'); var simpledblayerTests = require(“ ./lib/simpledblayer/test.js”);
var tests = simpledblayerTests.get(
function getDbInfo( done ) {
mw.connect('mongodb://localhost/tests', {}, function( err, db ){
if( err ){
throw new Error("MongoDB connect: could not connect to database");
} else {
done( null, db, driver );
}
});
},
function closeDb( db, done ) {
db.close( done );
}
);
for(var test in tests) {
exports[ test ] = tests[ test ];
}
基本上,由實際的“主”模塊導出的get()
函數(稍后會詳細介紹)具有兩個參數:兩個用於打開和關閉數據庫連接的函數。
該get()
函數返回一堆准備好導出的函數-構成單元測試的函數。
主模塊將具有以下內容:
exports.get = function( getDbInfo, closeDb ){
var tests;
var g = {};
var startup = function( test ){
var self = this;
test.doesNotThrow( function(){
getDbInfo( function( err, db, driver ){
if( err ){
throw( new Error("Could not connect to db, aborting all tests") );
process.exit();
}
// Set the important g.driver variables (db and driver)
g.db = db;
d.driver = driver
test.done();
});
});
}
var finish = function( test ){
var self = this;
closeDb( g.db, function( err ){
if( err ){
throw( new Error("There was a problem disconnecting to the DB") );
}
test.done();
});
};
tests = {
startup: startup,
// ...
// Your tests here. All functions will have access to g.db and g.driver
// ...
finish: finish
}
return tests;
}
這樣,每個模塊都將運行相同的測試。 但是, driver
變量和用於連接/斷開數據庫的功能將很簡單。
使用實際代碼查看它:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.