培根压缩流在匹配完成时未结束导致测试套件挂起
Bacon zipped Stream not ending when matches complete causing test suite to hang
我一直在尝试使用 Bacon 的 zip...() 操作来创建 Mocha 测试套件,其中来自实际异步网络事件的一系列值可以与一系列目标值进行比较以验证正确的行为.
但是,测试用例中的压缩流永远不会终止。
我有一个成功的 Bacon 测试用例,其中两个流 'faked' 通过从数组创建两个流。此测试用例成功终止,流的 toPromise() 无错误返回。 https://gist.github.com/cefn/7fd3504a0b29575f3b6f
然而,在其中一个流实际连接到异步网络事件的情况下,toPromise()
调用永远不会完成并且测试套件挂起,即使我可以通过 V8 调试器得知目标序列中的最终数组条目确实匹配。
我不明白是什么导致流在一种情况下结束而在另一种情况下不结束。是否有我可以进行的配置更改,或流中事件数量的显式声明,或其他内容,以强制从压缩流中触发流结束事件。
it("Sends branch keys then leaf values", function(){
var sniffer = mqtt.connect(conf.mqttWsAddr);
var subscribeAndSendPromise = util.createSubscriptionPromise(sniffer, '#')
.then(function(){
writer.setItem('oldmacdonald/farm', {
sheep:"Baa",
pig:"Oink",
cow:"Moo",
duck:"Quack",
});
});
var actualStream = Bacon.fromEvent(sniffer, "message", function(topic,payload,packet){
packet.message = payload.toString();
return packet;
});
var targetStream = Bacon.sequentially(0,[
["the_workshop/oldmacdonald", "[]" ] , //originally empty
// ["the_workshop/oldmacdonald", JSON.stringify(['farm']) , // TODO somehow missing
// ["the_workshop/oldmacdonald/farm", JSON.stringify([]) ] , // TODO somehow missing
["the_workshop/oldmacdonald/farm", JSON.stringify(['sheep','pig','cow','duck']) ] , //n.b. JSON array
["the_workshop/oldmacdonald/farm" + "/sheep", JSON.stringify("Baa")] , //n.b. quoted JSON strings
["the_workshop/oldmacdonald/farm" + "/pig", JSON.stringify("Oink")] ,
["the_workshop/oldmacdonald/farm" + "/cow", JSON.stringify("Moo")] ,
["the_workshop/oldmacdonald/farm" + "/duck", JSON.stringify("Quack")] ,
]);
var deepEqual = function(targetValues, actualPacket){
var actualTopic = actualPacket.topic;
var actualMessage = actualPacket.message;
var targetTopic = targetValues[0];
var targetMessage = targetValues[1];
assert(actualTopic == targetTopic);
assert(actualMessage == targetMessage);
return true;
};
var zippedStream = Bacon.zipAsArray(targetStream, actualStream);
zippedStream.onValues(deepEqual);
var receivePromise = zippedStream.toPromise();
receivePromise.finally(function(){
sniffer.end();
});
return Q.all([subscribeAndSendPromise, receivePromise]);
})
问题是 actualStream
永远不会结束:它是用 fromEvent
创建的,并且永远监听 EventEmitter。
zippedStream
仅在targetStream
和actualStream
都结束时才结束。
您可以使用以下方法向 actualStream 添加超时:
var actualStreamWithTimeout = actualStream.takeUntil(Bacon.later(1000))
我一直在尝试使用 Bacon 的 zip...() 操作来创建 Mocha 测试套件,其中来自实际异步网络事件的一系列值可以与一系列目标值进行比较以验证正确的行为.
但是,测试用例中的压缩流永远不会终止。
我有一个成功的 Bacon 测试用例,其中两个流 'faked' 通过从数组创建两个流。此测试用例成功终止,流的 toPromise() 无错误返回。 https://gist.github.com/cefn/7fd3504a0b29575f3b6f
然而,在其中一个流实际连接到异步网络事件的情况下,toPromise()
调用永远不会完成并且测试套件挂起,即使我可以通过 V8 调试器得知目标序列中的最终数组条目确实匹配。
我不明白是什么导致流在一种情况下结束而在另一种情况下不结束。是否有我可以进行的配置更改,或流中事件数量的显式声明,或其他内容,以强制从压缩流中触发流结束事件。
it("Sends branch keys then leaf values", function(){
var sniffer = mqtt.connect(conf.mqttWsAddr);
var subscribeAndSendPromise = util.createSubscriptionPromise(sniffer, '#')
.then(function(){
writer.setItem('oldmacdonald/farm', {
sheep:"Baa",
pig:"Oink",
cow:"Moo",
duck:"Quack",
});
});
var actualStream = Bacon.fromEvent(sniffer, "message", function(topic,payload,packet){
packet.message = payload.toString();
return packet;
});
var targetStream = Bacon.sequentially(0,[
["the_workshop/oldmacdonald", "[]" ] , //originally empty
// ["the_workshop/oldmacdonald", JSON.stringify(['farm']) , // TODO somehow missing
// ["the_workshop/oldmacdonald/farm", JSON.stringify([]) ] , // TODO somehow missing
["the_workshop/oldmacdonald/farm", JSON.stringify(['sheep','pig','cow','duck']) ] , //n.b. JSON array
["the_workshop/oldmacdonald/farm" + "/sheep", JSON.stringify("Baa")] , //n.b. quoted JSON strings
["the_workshop/oldmacdonald/farm" + "/pig", JSON.stringify("Oink")] ,
["the_workshop/oldmacdonald/farm" + "/cow", JSON.stringify("Moo")] ,
["the_workshop/oldmacdonald/farm" + "/duck", JSON.stringify("Quack")] ,
]);
var deepEqual = function(targetValues, actualPacket){
var actualTopic = actualPacket.topic;
var actualMessage = actualPacket.message;
var targetTopic = targetValues[0];
var targetMessage = targetValues[1];
assert(actualTopic == targetTopic);
assert(actualMessage == targetMessage);
return true;
};
var zippedStream = Bacon.zipAsArray(targetStream, actualStream);
zippedStream.onValues(deepEqual);
var receivePromise = zippedStream.toPromise();
receivePromise.finally(function(){
sniffer.end();
});
return Q.all([subscribeAndSendPromise, receivePromise]);
})
问题是 actualStream
永远不会结束:它是用 fromEvent
创建的,并且永远监听 EventEmitter。
zippedStream
仅在targetStream
和actualStream
都结束时才结束。
您可以使用以下方法向 actualStream 添加超时:
var actualStreamWithTimeout = actualStream.takeUntil(Bacon.later(1000))