作为 Node.js 中的 TDD 练习,我正在尝试实现一个非常简单的“数据库”,它将事物存储为平面文件。这是 DB 模块代码的最开始:
var fs = require( 'fs' );
exports.create = function( path, readycallback ) {
new FlatFileDB( path, readycallback );
};
function FlatFileDB( path, readycallback ) {
this.path = path;
readycallback( null, this );
}
FlatFileDB.prototype.getPath = function() {
return this.path;
};
数据库创建是异步的,在我的测试用例中,我检查调用 create() 函数是否实际上会产生两个不同的对象:
var vows = require('vows'),
assert = require('assert'),
fs = require( 'fs' ),
flatfileDB = require( '../lib/flatfileDB' );
var twoDBs = {};
vows.describe( 'flatfileDB' ).addBatch( {
'creating the database': {
topic: flatfileDB,
'calling create': {
topic: function( flatfileDB ) {
flatfileDB.create( './createTest', this.callback );
},
'results in an object with the path passed in': function( err, db ) {
assert.equal( db.getPath(), './createTest' );
}
},
'calling create more than once': {
topic: function( flatfileDB ) {
flatfileDB.create( './db1', function( err, newdb ) {
twoDBs.db1 = newdb;
flatfileDB.create( './db2', function( err, newdb ) {
twoDBs.db2 = newdb;
this.callback( null, twoDBs );
} );
});
},
'results in two objects with different paths.': function( err, dbs ) {
console.log( 'twoDBs. db1: ' + twoDBs.db1 + ', db2: ' + twoDBs.db2 );
console.log( 'dbs: ' + JSON.stringify( dbs ) );
assert.notEqual( twoDBs.db1.getPath(), twoDBs.db2.getPath() );
}
}
},
}).run();
不过,这两行 console.log 的输出让我感到惊讶:
两个数据库。db1:[对象对象],db2:[对象对象] 数据库:{}
因为我将 twoDBs 传递给测试回调,所以我曾期望 dbs 和 twoDBs 是某个对象,但它们似乎不是。任何人都可以帮我解决这里发生的事情吗?