私は、nodejs、express、および mongodb を使用して Web アプリに取り組んでいます。
API 呼び出しをリストした「メイン」ファイルに、Users.authenticate(userObject, callback) や Users.getById(userId, callback) などのメソッドを持つ Users クラスを含めます。
この長いコード スニペットで申し訳ありません。これは、ユーザー クラスのほんの一部です。
function Users (db) {
if (!db) {
return {'message': 'creating an instance of Users requires a database'}
} else {
this.db = db;
return this;
}
}
Users.prototype.authenticate = function (user, callback) {
if (!user.username) {
return {'message': 'Users.authenticate(user, callback) requires user.username'};
} else if (!user.password) {
return {'message': 'Users.authenticate(user, callback) requires user.password'};
} else if (!callback) {
return {'message': 'Users.authenticate(user, callback) requires callback(err, user)'};
}
this.db.collection('users', function (err, collection) {
if (err) {return {'message': 'could not open users collection'}};
/* query for the user argument */
collection.findOne(user, function (err, doc) {
if (!err) {
if (!doc) {
callback({'message': 'user does not exist'}, null);
} else {
callback(null, doc);
}
} else {
callback({'message': 'error finding user'}, null);
}
});
});
};
exports.Users = Users;
それでおしまい
開いている DB 接続を Users クラスに渡し、次のような呼び出しを行います。
var server = new mongo.Server('localhost', '27017', {auto_reconnect: true});
var db = new mongo.Db('supportdash', server, {"fsync": true});
// open connection to be, init users
db.open(function (err, db) {
var users = new Users(db);
users.authenticate({"username": "admin", "password": "password"}, function (err, user) {
// do something with the error, or user object
});
});
今、私の質問のために
開いている db 接続を渡す必要がありますか、またはユーザー クラスが独自の接続を管理するために必要な情報 (ローカルホスト、ポート、データベース名) を渡す必要がありますか?
jasmine-node でテストをセットアップしようとしましたが、非同期データベース呼び出しで多くの問題が発生しました。ユーザーを追加して、Users.authenticate が機能していることをテストしたかったのです。Jasmines の runs() および waitsfor() 非同期ヘルパーを使用しましたが、機能させることができませんでした。その後、(別のクラスで)デバッグするのに時間がかかる問題に遭遇しましたが、テストを行うことで多くの時間を節約できたはずです。mongodb データベースと対話するクラスをテストする方法について何かアドバイスはありますか?