断言流

时间:2015-04-18 01:45:41

标签: node.js tap

你会如何处理流声明?也就是说,你关心输入的顺序,但不是它们是排他性的(可能介于两者之间)。

在每个阶段听取事件当然是可行的,但它会变得非常冗长,寻找更实用的解决方案。

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');
      });
    });
  });
});

1 个答案:

答案 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是什么或如何使用它,所以我没有。