17

すべてのテストが実行された後、データベースを削除して接続を閉じる関数を配置する場所を見つけようとしています。

ネストされたテストは次のとおりです。

//db.connection.db.dropDatabase();
//db.connection.close();

describe('User', function(){
    beforeEach(function(done){
    });

    after(function(done){
    });

    describe('#save()', function(){
        beforeEach(function(done){
        });

        it('should have username property', function(done){
            user.save(function(err, user){
                done();
            });
        });

        // now try a negative test
        it('should not save if username is not present', function(done){
            user.save(function(err, user){
                done();
            });
        });
    });

    describe('#find()', function(){
        beforeEach(function(done){
            user.save(function(err, user){
                done();
            });
        });

        it('should find user by email', function(done){
            User.findOne({email: fakeUser.email}, function(err, user){
                done();
            });
        });

        it('should find user by username', function(done){
            User.findOne({username: fakeUser.username}, function(err, user){
                done();
            });
        });
    });
});

何も機能していないようです。エラーが表示されます: 2000 ミリ秒のタイムアウトを超えました

4

2 に答える 2

28

クリーンアップを処理するためafter()に、最初のフックの前に「ルート」フックを定義できます。describe()

after(function (done) {
    db.connection.db.dropDatabase(function () {
        db.connection.close(function () {
            done();
        });
    });
});

describe('User', ...);

ただし、発生しているエラーは、Mocha に続行するように通知していない 3 つの非同期フックによるものである可能性があります。done()これらは、同期として扱うことができるように、引数を呼び出すかスキップする必要があります。

describe('User', function(){
    beforeEach(function(done){ // arg = asynchronous
        done();
    });

    after(function(done){
        done()
    });

    describe('#save()', function(){
        beforeEach(function(){ // no arg = synchronous
        });

        // ...
    });
});

ドキュメントから

コールバック (通常は という名前done) をit()Mocha に追加することで、完了を待つ必要があることがわかります。

于 2012-12-16T05:31:12.650 に答える
0

少し違う方法で実装しました。

  1. 「before」フック内のすべてのドキュメントを削除しました - dropDatabase() よりもはるかに高速であることがわかりました。
  2. Promise.all() を使用して、フックを終了する前にすべてのドキュメントが削除されていることを確認しました。

    beforeEach(function (done) {
    
        function clearDB() {
            var promises = [
                Model1.remove().exec(),
                Model2.remove().exec(),
                Model3.remove().exec()
            ];
    
            Promise.all(promises)
                .then(function () {
                    done();
                })
        }
    
        if (mongoose.connection.readyState === 0) {
            mongoose.connect(config.dbUrl, function (err) {
                if (err) {
                    throw err;
                }
                return clearDB();
            });
        } else {
            return clearDB();
        }
    });
    
于 2016-02-14T18:31:46.093 に答える