4

我正在使用 nodeunit 进行一些异步测试,我想知道是否可以告诉 nodeunit 在调用 test.done 之前不要终止测试用例。

基本上这就是我的测试用例现在的样子:

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 回答
1

我刚刚遇到了一个非常相似的问题,因此我正在浏览这个问题。在我的情况下,服务器(类似于您的 WrappedServer)抛出异常,导致测试突然退出而没有使用 test.done() 访问我的事件处理程序。我认为 nodeunit 不偷看就吞下异常是相当粗鲁的。

我不得不求助于调试器来查找问题,如果您以前没有这样做过,我可以为您节省网络搜索: node --debug-brk node_modules/nodeunit/bin/nodeunit your_nodeunit_test.js

于 2014-07-24T06:02:29.513 回答
0

当 nodeunit 说“Undone tests”时,这意味着节点进程在没有完成所有测试的情况下已经退出。需要明确的是,这并不意味着“PONG 没有足够快地发回”,而是意味着事件循环中没有更多的处理程序。如果没有更多的处理程序,则 PONG 事件将无处可去,因此无法继续测试。

例如,如果你运行这样的东西:

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

当你运行listen时,服务器开始监听传入的数据,并被添加到事件循环中以检查传入的连接。如果你只做了 createServer 那么不会触发任何事件并且你的程序只会退出。

您是否有任何与error任何可能导致错误未出现的事件绑定的东西?

于 2012-02-21T15:06:46.790 回答
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 回答