我正在使用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没有足够快地发送回来以便执行测试代码。有任何想法吗?
答案 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
});
};