2013-08-29 31 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'); 
     }); 
    } 
}