可以告诉nodeunit在调用test.done()之前不要完成特定的测试吗?

时间:2012-02-21 00:46:22

标签: node.js nodeunit

我正在使用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 个答案:

答案 0 :(得分: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);       
};

答案 1 :(得分:1)

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

我不得不求助于调试器来找到问题,如果你以前没有做过,我可以为你保存一个网络搜索:node --debug-brk node_modules / nodeunit / bin / nodeunit your_nodeunit_test.js

答案 2 :(得分:0)

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

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

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

运行listen时,服务器开始侦听传入数据,并添加到事件循环以检查传入连接。如果您只执行了createServer,则不会触发任何事件,您的程序将退出。

您是否有任何可能导致错误未显示的error事件的事件?

答案 3 :(得分: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
  });
};