2014-06-12 36 views
0

我正在通過AngularDart教程工作,並在完成練習時嘗試編寫單元測試。Dart unittest產生無益輸出

我有一個測試,看起來像這樣:

test('should convert sugar ingredient to maple syrup', inject((SugarFilter filter) { 
    var r1 = new Recipe(null, null, null, ['has sugar in ingredients '], 'bla', null, null); 
    var r1New = new Recipe(null, null, null, ['has maple syrup in ingredient '], 'bla', null, null); 
    var r2 = new Recipe(null, null, null,[ 'has pure ingredients'], 'bla', null, null); 
    var inList = [r1, r2]; 
    var outList = [r1New, r2]; 
    expect(filter(inList), equals(outList)); 
})); 

測試失敗,此輸出:

Test failed: Caught Expected: [Instance of 'Recipe', Instance of 'Recipe'] 
    Actual: [Instance of 'Recipe', Instance of 'Recipe'] 
    Which: was <Instance of 'Recipe'> instead of <Instance of 'Recipe'> at location [0] 

我試圖修改爲「categoryFilter」現有的測試,使失敗而且我得到了相同的,相當無益的輸出。

有沒有辦法讓兩個對象的比較輸出更有意義?

回答

1

當您比較兩個包含不同對象的列表時,您會如何預期? 它們是否應該相等,因爲每個列表包含兩個Receipe實例? 無論如何filter()是什麼?

兩個列表僅相當於如果是同一個列表:

expect(inList, equals(inList)); 

您可以使用像everyElementorderedEqualsunorderedEquals一個匹配比較列表中的內容。但是,如果您將不同的實例放入列表中,即使它們屬於同一類,該比較仍然會失敗。

如果您希望比較的行爲不同,您必須重寫Receipe類的equals()方法(這也需要覆蓋get hashCode)。

您可以覆蓋Receipe中的toString()方法以獲得更好的錯誤消息,例如將某些字段的值添加到輸出字符串。

@override 
String toString() => '${super.toString()} ${name}'; // I don't know if the Receipe class has a name field though