2013-08-29 52 views
3

有没有一种常规方法来尝试一组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' 

不过我想要得到通知所有三个名字都失踪了,因为在这种情况下失败一个条件并不妨碍评估他人。

与其编写一个包装方法来聚合这些检查的可能输出并抛出一个错误,我希望能有第三方库“专门化”这类事情或者可能内置的功能我俯视。

回答

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

如果我可能会认为你对模糊断言包装库的需求听起来有误。对于什么是“软”与“硬”断言失败,你的模糊规则和启发式看起来似乎比使用现有断言范式的旧编程更不明智的选择。这是测试。这应该是简单易懂的。

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

+0

“软”断言正是我前往的地方,但我明白了你的观点;我想这些的需要表明我的测试缺乏教科书原子性。也许我真正追求的是一种模式,允许(在上面的例子中)从输入数组中创建3个单独的测试?我会解决类似于'includesOne'的问题,但是我想不出一种断言失败的方式,将其记录为缺少值的显式列表。 –

2

我可以提供两种方法。

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