2

非同期データベース呼び出しの単体テストを作成しようとしています。私は、ORMnomnomパッケージを orm db アクセスとしてインストールし、単体テスト用にnodeunitを使用して NodeJS を使用しています。しかし、この簡単なテストではハングします:

ここにコード test\test1.js があります

modelsdb = require('../model/model_db')

exports['test db'] = function (test) {
  test.expect(1);
  console.log('test db');
  modelsdb.MyTable.objects.all( function (err, data) { 
    test.ok(true, "this assertion should pass"); 
    test.done();
    console.log('test must finish here!');
  });
}

exports.testSomething = function(test){
  console.log('testSomething');
  test.expect(1);
  test.ok(true, "this assertion should pass");
  test.done();
};

このテストを実行すると、すべてのアサーションが渡され、コンソールに次のメッセージが表示されます: 'test db' 'test must finish here!' 'testSomething' (test.done() がコールバック関数内に到達したことを意味します) ですが、テストは終了しません。手動で停止する必要があります。「プロセスは終了コード 1 で終了しました」を取得します。test.ok(false,"") に変更すると、AssertionError が発生しますが、テストも終了しません。「test db」を削除して testSomething 関数のみを残した場合、テストは期待どおりに終了し、すべてのアサーションがパスしました。

nodeunit ベースの testpilotパッケージも試してみました。それは与えます

test1
   FAIL : test db
      an error occurred during test:
         Error: timed out waiting for test

助言がありますか?ありがとう。

4

2 に答える 2

2

エクスポートにメソッドを追加して、tearDownmongooseの接続プールを閉じます。それがまだ開いている限り、テストは終了しません。

マングースの接続をどのように開いているかは表示されませんが、次のようになります。

exports.tearDown = function (callback) {
    mongoose.disconnect(callback);
};
于 2012-12-30T03:30:40.820 に答える
0

私は nodeunit と q/mongoose で同様の問題を抱えています - そのために開かれたバグがあります。process.exit(0)を呼び出した後にひどいことをしようとしましたが、test.done()保留中のログはフラッシュされない可能性があるため、理想的ではありません。process.exit(0)タイムアウトブロックを呼び出さなければならなくなりました。

于 2012-12-30T02:52:50.927 に答える