4

私はnodeunitでいくつかの非同期テストを行っていますが、test.doneが呼び出されるまでテストケースを終了しないようにnodeunitに指示できるかどうか疑問に思っていました.

基本的に、これは私のテストケースが今どのように見えるかです:

exports.basic = testCase({

  setUp: function (callback) {
    this.ws = new WrappedServer();
    this.ws.run(PORT);
    callback();
  },

  tearDown: function (callback) {
    callback();
  },

  testFoo: function(test) { 
    var socket = ioClient.connect(URL);
    socket.emit('PING', 1, 1);
    socket.on('PONG', function() { 
      // do some assertion of course
      test.done();
    }); 
  }
});

ここでの問題は、テスト コードを実行するのに十分な速さで PONG が返されないことです。何か案は?

4

4 に答える 4

1

問題は、nodeunit がexpectアサーションをまったく処理していないため、アサーションを待たずにすぐに終了することです。アサーションを数えてtest.expect()、テストの最初に呼び出します。

exports.example = function(test) {
    // If you delete next line, the test will terminate immediately with failure.
    test.expect(1);

    setTimeout(function(){
        test.ok(true);
        test.done();
    }, 5000);       
};
于 2013-09-05T08:09:03.230 に答える
0

おそらく次のようなものが必要です。

/** Invoke a child function safely and prevent nodeunit from swallowing errors */
var safe = function(test, x) {
  try { x(test); } catch(ex) {
    console.log(ex);
    console.log(ex.stack);
    test.ok(false, 'Error invoking async code');
    test.done();
  }
};

exports.testSomething = function(test){
  test.expect(1); // Prevent early exit
  safe(test, function(test) {
    // ... some async code here
  });
};
于 2015-05-29T03:40:29.957 に答える
0

nodeunit が「テストを元に戻す」と言う場合、それはノード プロセスがすべてのテストを終了せずに終了したことを意味します。明確にするために言うと、これは「PONG が十分に速く返されない」という意味ではなく、イベント ループにハンドラーがなくなったということです。ハンドラーがなくなると、PONG イベントが発生する場所がないため、テストを続行できなくなります。

たとえば、次のようなものを実行したとします。

var s = require('http').createServer();
s.listen(80)

を実行するlistenと、サーバーは着信データのリッスンを開始し、着信接続をチェックするためにイベント ループに追加されます。createServer のみを実行した場合、イベントは発生せず、プログラムは終了します。

errorエラーが表示されないようにする可能性のあるイベントにバインドされているものはありますか?

于 2012-02-21T15:06:46.790 に答える