在测试失败之前允许多个AssertionErrors

时间:2013-08-29 00:33:00

标签: node.js selenium mocha chai

在测试失败之前是否有传统的方法尝试一组assert始终被评估?

假设我的测试评估页面上是否存在某些名称:

var pageContent = 'dummy page content';

//.include(haystack, needle, [message])
//Asserts that haystack includes needle.

assert.include(pageContent, 'Alice');
assert.include(pageContent, 'Bob');
assert.include(pageContent, 'John');

现在,如果Alice丢失,测试将失败并出现一个错误:

>AssertionError: expected 'dummy page content' to contain 'Alice'

但是我想通知所有三个名字都缺失,因为在这种情况下,一个条件失败并不会阻止评估其他条件。

我没有编写一个汇总这些检查的可能输出并且抛出一个错误的包装器方法,而是希望第三方库可以“专攻”这类东西或者内置功能我忽视。

2 个答案:

答案 0 :(得分:3)

我可以提供两种方法。

@Peter Lyons提到的第一个,依赖于将多个断言转换为多个值的单个断言。要使断言错误消息有用,最好在名称列表上断言:

var expected = ['Alice', 'Bob', 'John'];
var found = expected.filter(function(name) {
   return pageContent.indexOf(name) >= 0;
}

// assuming Node's require('assert')
assert.deepEqual(found, expected);
// Example error message:
// AssertionError: ["Alice","Bob","John"] deepEqual ["Alice"]

第二种方法使用“参数化测试”。我假设您使用BDD样式在我的代码中指定测试用例。

describe('some page', function() {
   for (var name in ['Alice', 'Bob', 'John'])
     itContainsString(name);

   function itContainsString(name) {
      it('contains "' + name + '"', function() {
        var pageContent = 'dummy page content';
        assert.include(pageContent, 'Alice');
      });
   }
}

答案 1 :(得分:1)

var found = ['Alice', 'Bob', 'John'].map(function (name) {
  return pageContent.indexOf(name) >= 0;
});
assert.include(found, true);

如果我认为您对模糊断言的包装库的需求听起来是错误的。关于什么是“软”与“硬”断言失败的模糊规则和启发式似乎比使用现有断言范式的良好旧编程更不明智。它正在测试中。它应该是直截了当且容易推理的。

请记住,您始终可以采用上述逻辑并将其包装在名为includesOne(pageContent, needles)的函数中,以便在测试中方便地重复使用。