Dart unittest产生无用的输出

时间:2014-06-12 08:18:44

标签: dart angular-dart dart-unittest

我正在完成AngularDart教程,并在完成练习时尝试编写单元测试。

我有一个看起来像这样的测试:

    
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 个答案:

答案 0 :(得分:1)

比较包含不同对象的两个列表时,您期望到底是什么? 它们应该相等,因为每个列表包含两个Receipe实例吗? 无论如何,filter()是什么?

如果列表相同,则两个列表相同:

expect(inList, equals(inList));

您可以使用everyElementorderedEqualsunorderedEquals等匹配器来比较列表的内容。但是如果你将不同的实例放入列表中,即使它们属于同一个类,那么比较仍然会失败。

如果您希望比较的行为不同,则必须覆盖equals()类的Receipe方法(这也需要覆盖get hashCode)。

您可以覆盖Receipe中的toString()方法以获得更好的错误消息,例如将某些字段的值添加到输出字符串。

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