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」の既存のテストを変更して失敗させようとしたところ、同じ、むしろ役に立たない出力が得られました。

2 つのオブジェクトの比較からの出力をより意味のあるものにする方法はありますか?

4

1 に答える 1

1

異なるオブジェクトを含む 2 つのリストを比較すると、正確には何が期待できますか? 各リストには 2 つの Receipe インスタンスが含まれているため、それらは等しいはずですか? filter()とにかく何ですか?

2 つのリストは、同じリストである場合にのみ等しくなります。

expect(inList, equals(inList));

またはのようeveryElementなマッチャーを使用して、リストの内容を比較できます。ただし、異なるインスタンスをリストに入れると、それらが同じクラスであっても、比較は失敗します。orderedEqualsunorderedEquals

比較の動作を変更したい場合equals()は、クラスのメソッドをオーバーライドReceipeする必要があります (これには override も必要get hashCodeです)。

ReceipeのメソッドをオーバーライドtoString()して、より適切なエラー メッセージを取得できます。たとえば、いくつかのフィールドの値を出力文字列に追加できます。

@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 に答える