我正在玩誓言和nodejs。
var vows = require('vows');
var http = require('http');
var suite = vows.describe('testing');
var host = 'www.google.com', port = '80', path = '/', method = 'GET';
suite.addBatch({
'A context': {
topic: function(){
http.get({
host: host,
port: port,
path: path,
method: method
}, this.callback);
},
"sample test": function(res, extra){//here extra is just to prevent vows error
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);//It never gets logged
});
console.log('HEADERS: ' + JSON.stringify(res.headers));//it is working
}
}
});
suite.export(module);
但我无法得到答复机构。我做错了什么。
我使用的是nodejs v 0.6.6和vows v0.6.2
答案 0 :(得分:1)
从我所看到的情况来看,Vows在this.callback
运行时不会直接调用测试。它延迟了processnextTick
。如果我不得不猜测,也许在此期间会发出“数据”事件。这意味着在触发所有数据事件之前,您不会绑定“数据”功能。
实际上,问题是Vows测试应该将所有这样的异步逻辑分离到topic
本身。如果你真的想在测试中检查块,那么就这样做。
另请注意,您可以拥有任意数量的块,而不仅仅是一个data
个事件。您可能需要设置流编码,并将数据作为字符串加入。您当前的代码隐式地将Buffer转换为字符串,该字符串可能会破坏多字节字符。
suite.addBatch({
'A context': {
topic: function(){
var cb = this.callback;
var req = http.get({
host: host,
port: port,
path: path,
method: method
});
// Aggregate all chunks before running callback
req.on('response', function(res) {
var chunks = []
res.on('data', function(chunk) {
chunks.push(chunk);
});
res.on('end', function() {
cb(null, res, chunks);
});
});
// Handle connection failures.
req.on('error', cb);
},
"sample test": function(err, res, chunks){
chunks.forEach(function (chunk, i) {
console.log('BODY piece ' + i + ': ' + chunk);
});
console.log('HEADERS: ' + JSON.stringify(res.headers));
}
}
});