2

saveMongoose でミドルウェアを使用して、何らかのアクションが実行されるたびに DB にアクティビティのログを作成しています。何かのようなもの

UserSchema.post("save", function (doc) {
    mongoose.model("Activity").create({activity: "User created: " + doc._id});
});

これは正常に動作しているように見えますが、問題は、コールバックを渡す方法がないためテストできないことですpost(おそらく意味がありません)。以下を使用してこれをテストmochaします。

User.create({name: "foo"}, function (err, user) {
    Activity.find().exec(function (err, act) {
        act[0].activity.should.match(new RegExp(user._id));
        done();
    });
});

問題は、が呼び出されるActivity.create前に明らかに終了しないことです。でラップする.findことでこれを回避できますが、これはハッキーに思えます。非同期のマングース ミドルウェア操作をテストする方法はありますか?.findsetTimeout

4

2 に答える 2

1

残念ながら、これら 2 つの非同期関数を希望する方法で確実にインターリーブする方法はありません (スレッドがないため、実行を「一時停止」することはできません)。それらは一貫性のない順序で完了する可能性があり、タイムアウトなどの解決策が必要になります。

アクティビティが書き込まれたり失敗したりしたときに、ログに記録する必要があるキューに入れられた (ハッシュされた?) アクティビティのリストを参照できるように、イベント ハンドラーをアクティビティ クラスに接続することをお勧めします。したがって、アクティビティが作成されたら、リストに追加します ( "onactivitycreated")。その後、最終的には ( "onactivitywritten") と記述され、成功を比較して削除する可能性があります (モカで何が意味があるのか​​わかりません)。テストが完了すると、リストが空の。

util.inherits(Activity, EventEmitter)たとえば、Activity クラスをイベント機能で拡張するために使用できます。

イベントを通じて処理されなかった障害があった場合は、それも処理する必要があります。

編集 -- 以下の提案は、うまくいかない非同期の興味深いデモとして無視してください。:)

それらをテストしたい場合は、asyncのようなライブラリを見て、コードを連続して(またはwaterfallこの場合は)実行できるようにして、最初に を作成しUser、完了したら、正しいものActivityが記録されていることを確認します。ここで使用waterfallしたのは、あるタスクから次のタスクに値を渡すことができるようにするためです。

async.waterfall([
    function(done) {
       User.create({name: "foo"}, function (err, user) {
           if (err) { done(err); return; }
           done(null, user._id);  // 2nd param sent to next task as 1st param
       });

    },
    function(id, done) {  // got the _id from above
        // substitute efficient method for finding
        // the corresponding activity document (maybe it's another field?)
        Activity.findById(id, function (err, act) {
            if (err) { done(err); return; }
            if (act) { done(null, true);
            done(null, false); // not found?!
        });
    }
], function(err, result) {
   console.log("Success? " + result);
});
于 2013-08-28T19:34:52.683 に答える