0

我正在完成 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”的现有测试以使其失败,并且得到相同但无用的输出。

有没有办法让两个对象的比较输出更有意义?

4

1 回答 1

1

当您比较包含不同对象的两个列表时,您究竟期望什么?它们是否应该相等,因为每个列表都包含两个 Receipe 实例?到底是什么filter()

两个列表只有在相同列表时才相等:

expect(inList, equals(inList));

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

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

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

@override
String toString() => '${super.toString()} ${name}'; // I don't know if the Receipe class has a name field though
于 2014-06-12T08:28:54.253 回答