你会如何处理流声明?也就是说,你关心输入的顺序,但不是它们是排他性的(可能介于两者之间)。
在每个阶段听取事件当然是可行的,但它会变得非常冗长,寻找更实用的解决方案。
Brute方法类似于以下磁带测试
t.plan(3);
var exe = child.spawn(...);
exe.stdout.once('data', first function(data) {
// first expected output is always 1
t.equal(data.toString(), '1\n');
// next, 2, 3, 4 is coming but in unknown order.
// the test only tests for 2
exe.stdout.on('data', function second(data) {
if (data.toString() !== '2\n') {
// skip, don't care about this entry
return;
}
exe.stdout.removeListener('data', second);
t.equal(data.toString(), '2\n');
// next is 5, 6, 7, again in unknown order but they are
// AFTER the previous sequence
exe.stdout.on('data', function third(data) {
if (data.toString() !== '7\n') {
// skip, don't care about this entry
return;
}
exe.stdout.removeListener('data', third);
t.equal(data.toString(), '7\n');
});
});
});
});
答案 0 :(得分:0)
这是一个潜在的解决方案。我们添加一个数据监听器,每次我们得到一个事件时,我们检查它是否与我们期望的下一个事物匹配,如果是这样,那么从预期值数组中删除它。最后,当我们清空数组时,我们称之为回调。我假设您在收到预期回复时有回拨电话。您可能希望确保此测试超时;否则它将永远等待,永远不会失败。
assertStreamWithGaps = function(stream, strs, next) {
stream.on('data', function(data) {
if(data.toString() === strs[0]) {
strs.shift();
if(strs.length === 0) {
next();
}
}
});
}
您可以在示例中将其称为:
assertStreamWithGaps(exe.stdout, ['1\n', '2\n', '7\n']);
这与完全匹配您的示例,因为您希望没有前导空白。我不清楚这是否是故意的,所以我跳过它。添加该功能可能很容易。
另外,我不确定t
是什么或如何使用它,所以我没有。