node.js - 断言流

标签 node.js tap

你会如何处理流断言?也就是说,您关心输入的顺序,但不关心它们是排他的(中间可能有一些东西)。

监听每个阶段的事件当然是可行的,但它变得非常冗长,需要寻找更务实的解决方案。

暴力方法类似于以下磁带测试

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

最佳答案

这是一个可能的解决方案。我们添加一个数据监听器,每次收到事件时,我们都会检查它是否与我们期望的下一个事件匹配,如果是,则将其从期望值数组中删除。最后,当我们清空数组时,我们调用回调。我假设当您得到预期的响应时您可以调用回调。您可能需要确保此测试有超时;否则它将永远等待并且永远不会失败。

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

关于node.js - 断言流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711983/

相关文章:

node.js - Jasmine spy document.execCommand 未被调用

javascript - 销毁 Node 中的请求

node.js - Sequelize : connect to database on run time based on the request

python - tap-mysql 不返回任何数据

ios - 点击更改 UIImageView alpha 状态

javascript - Sails.js + Mongodb 使用 ORM 插入嵌套的 json 记录

javascript - 迭代完成之前回调触发

javascript - 使用按钮在 iOS webview 中模拟点击

iphone - 具有自定义类型的 UIButton 似乎无法正常工作

android - 如何检查 MapView 上没有贴上 ItemizedOverlay?