0

after() 呼び出しでクリーンアップを行い、他の記述よりも前に行います。すべてのテストに合格すると、クリーンアップが機能します。ただし、いずれかのテストが失敗した場合、クリーンアップ コードは [エラー: 開いている接続がありません] というエラーを受け取ります。

mongodb のコールバックでのアサーションがエラーをスローし、接続が閉じられたと思います。それは私を混乱させます:

  • まず、mongodb のコールバックは、いくつかのアサーションを配置するのに適切な場所だと思います。
  • 次に、アサーションが失敗するとエラーが発生し、接続が閉じられます。
  • 最後に、接続が閉じられたため、クリーンアップは失敗します。

では、アサーションが失敗した場合でもクリーンアップを行うには、他に何をすべきでしょうか?

以下のサンプルコードを作成しました。

var mongo     = require('mongoskin')
  , should    = require('should')
  ;

describe('mongo', function() {

  var db;

  before(function() {
    console.log('before');
    db = mongo.db('devstack.local:27017/test')
  });

  after(function(done) {
    console.log('after');
    db.dropDatabase(function(err) {
      should.not.exist(err);// [Error: no open connections]
      db.close(done);
    });
  });

  describe('close', function() {
    it('should count!=0', function(done) {
      db.collection('empty').count(function(err, count) { 
        count.should.not.equal(0); // use an empty collection to make sure this fail
        done();
      });
    })
  })
})
4

1 に答える 1

0

ここに仮説があります: 接続は決して起こりません。

テストスイートを実行すると:

db = mongo.db('nonexistent:3333/test')

あなたが持っているアドレスの代わりに、私はあなたのエラーを完全に再現できます. ご了承ください:

  1. count.should.not.equal(0);モジュールcountによって定義されたフレームワークのいずれかが呼び出されたためではなく、 が未定義であるために失敗します。should

  2. チェックするようにテストを変換するとerr:

    it('should count!=0', function(done) {
      db.collection('empty').count(function(err, count) { 
        should.not.exist(err); // <<< This is where it fails now!
        count.should.not.equal(0); // use an empty collection to make sure this fail
        done();
      });
    });
    

次に、テストは次の場所で失敗しshould.not.exist(err)ますerr

[Error: failed to connect to [nonexistent:3333]]

いくつかの考え:

  1. 常にerrコールバックをチェックインしてください。

  2. データベース接続を確立するbeforeコールバックで、接続が確立されていない場合に失敗することが保証されている操作を少なくとも 1 つ実行します。できるだけ安価に実行できる操作が必要です。私はモンゴをよく知りませんが、これはうまくいくようです:

    before(function (done) {
      db = mongo.db(<put address here>, {safe: true});
      db.open(function (err) {
        should.not.exist(err);
        done();
      });
    });
    

    このようにして、Mocha はすぐに障害を検出します。

于 2014-01-06T14:49:23.113 に答える