在测试失败之前允许多个断言错误

o.v*_*.v. 5 selenium mocha.js node.js chai

是否有一种传统的方法可以assert在测试失败之前尝试始终对一组 s 进行评估?

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

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');
Run Code Online (Sandbox Code Playgroud)

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

>AssertionError: expected 'dummy page content' to contain 'Alice'
Run Code Online (Sandbox Code Playgroud)

然而,我希望得到通知,所有三个名字都丢失了,因为在这种情况下,一个条件失败并不妨碍评估其他条件。

我不是编写一个包装器方法来聚合这些检查的可能输出并抛出一个错误,而是希望有第三方库“专门从事”这类事情,或者可能是我忽略的内置功能。

Mir*_*toš 5

我可以提供两种方法。

@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"]
Run Code Online (Sandbox Code Playgroud)

第二种方法使用“参数化测试”。我假设您正在使用 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');
      });
   }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ons 1

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

如果我可以认为你对模糊断言的包装库的渴望听起来被误导了。关于什么是“软”与“硬”断言失败的模糊规则和启发法似乎比使用现有断言范例的良好旧编程更不明智。正在测试。它应该是简单且易于推理的。

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