2

JSONシリアライザーの実装をテストするいくつかのTestMethodsを実行しています.シリアライゼーション\デシリアライゼーションの前後に2つのIListオブジェクトを比較すると、比較は失敗します.

モデル

public class BusinessModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}

テスト

IList<BusinessModel> model = new List<BusinessModel>
{
    new BusinessModel { ID = 1, Name = "Test1" },
    new BusinessModel { ID = 2, Name = "Test2" },
    new BusinessModel { ID = 3, Name = "Test3" },
    new BusinessModel { ID = 4, Name = "Test4" }
};

[TestMethod]
public async Task TestSerialiseDeserialiseIsEqual()
{
    ISerialiser serialiser = new Serialiser();

    IList<BusinessModel> deserialisedModel;
    string serialised = string.Empty;

    serialised = await serialiser.SerialiseAsync<IList<BusinessModel>>(model);
    deserialisedModel = await serialiser.DeserialiseAsync<IList<BusinessModel>>(serialised);

    Assert.IsTrue(model.SequenceEqual(deserialisedModel));
}

結果

この投稿で詳しく説明している多くのテスト方法を試しましたが、すべて失敗しています。

Assert.AreEqual(t1.Count(), t2.Count());

IEnumerator<Token> e1 = t1.GetEnumerator();
IEnumerator<Token> e2 = t2.GetEnumerator();

while (e1.MoveNext() && e2.MoveNext())
{
    Assert.AreEqual(e1.Current, e2.Current);
}

コレクション カウント項目を渡しますが、最初のオブジェクト比較で失敗します。

Assert.IsTrue(model.SequenceEqual(deserialisedModel));

で失敗しますAssert.IsTrue failed

CollectionAssert.AreEqual(model.ToArray(),deserialisedModel.ToArray())

で失敗しますCollection.AreEqual failed (Element at index 0 do not match)

CollectionAssert.AreEquivalent(model.ToArray(),deserialisedModel.ToArray())

で失敗します{"CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of <Helper.Tests.Serialisation.BusinessModel>. The actual collection contains 0 occurrence(s). "}

オブジェクトを確認すると、それらは同じに見えます

オリジナル

ここに画像の説明を入力

逆シリアル化されたオブジェクト

ここに画像の説明を入力

質問

単体テストのためにIListオブジェクトを比較する最良の方法は何ですか? テストが失敗するのはなぜですか?

4

1 に答える 1

4

クラスに対してEqualsandを定義する必要があります。デフォルトの実装は参照等価であり、オブジェクト参照は 2 つのリスト内の項目で異なります。GetHashCodeBusinessModelEquals

IEqualityComparer<BusinessModel>または、等値/ハッシュ コードを定義する を作成し、それを に渡すこともできますSequenceEquals

于 2013-07-08T14:35:41.313 に答える