2017-10-24 10 views
1

現在、コピー機能のユニットテストを行っています。古いリストと新しくコピーされたリストの間のオブジェクトの要素を比較する必要があります。 これはうまくいきますが、forループを含まないようにすることができるかどうかは疑問でした。 は、ここに私のオブジェクトです:Assert 2つのオブジェクトのリストUnitTesting c#

new NaturePointObject 
      { 
       SId = 1, 
       Name = "Test", 
       Category = NaturePointCategory.Category1, 
       CreatorType = CreatorTypeEnum.1, 
       NaturR = NaturR.Bn, 
       Description = "Test", 
       Kumulation = Kumulation.EnEjendom, 
       Id = 1 
      } 

私の古いリストが含まれている「NaturePointObject」とnaturPointListと呼ばれ、それがnewNaturePointListと呼ばれるリストにコピーされます。

Assert.AreEqual(naturPointList.Count,newNaturePointList.Count); 
     for (var i = 0; i < newNatureList.Count; i++) 
     { 
      Assert.AreEqual(naturPointList[i].Category, newNaturePointList[i].Category); 
      Assert.AreEqual(naturPointList[i].Description, newNaturePointList[i].Description); 
      Assert.AreEqual(naturPointList[i].Kumulation, newNaturePointList[i].Kumulation); 
      Assert.AreEqual(naturPointList[i].Name, newNaturePointList[i].Name); 
      Assert.AreEqual(naturPointList[i].CreatorType, newNaturePointList[i].CreatorType); 
      Assert.AreEqual(naturPointList[i].NaturR, newNaturePointList[i].NaturR); 
      Assert.AreNotEqual(naturPointList[i].SId, newNaturePointList[i].SId); 
     } 

あなたが見ることができるように、オブジェクトのすべての要素が同じでなければならないではない。ここに は、私はそれが正常にコピーされたかどうかを知るためにアサート方法です。そして、私はオブジェクトの "Id"について気にしません。

forループを実行するよりも短い方法がありますか?

+0

短いですどちら? LinQクエリでループstufを回避することはできますが、それでもフードの下にループが作成されます。 – fharreau

+0

文字通りオブジェクト比較(ID無視)を行っているので、このhttps://github.com/jamesfoster/DeepEqualを見ることができます。これは、nugetパッケージとして利用できます。 – Aravind

+0

@fharreau見るのがちょっと短い。それはボンネットの下で同じであることは関係ありません。 –

答えて

0

あなたは同上を無視したい場合は、(IDSなし)他のクラスを作成することができます

Assert.IsTrue(naturPointList.SequenceEqual(newNaturePointList)); 

を試すことができます。

後で編集:あなたはEqualsメソッドを上書きし、Idを無視することができます。

1

は、おそらくあなたが使用したいCollectionAssert

CollectionAssert.AreEqual(naturPointList, newNaturePointList, NaturePointObject.CategoryCreatorTypeComparer); 

あなたは心の中で取る必要がある唯一のものは、あなたがAssert方法で使用するために、IComparerを実装する必要があるということです:中

public class NaturePointObject 
{ 
    private static readonly Comparer<NaturePointObject> CategoryCreatorTypeComparerInstance = new CategoryCreatorTypeRelationalComparer(); 

    private sealed class CategoryCreatorTypeRelationalComparer : Comparer<NaturePointObject> 
    { 
     public override int Compare(NaturePointObject x, NaturePointObject y) 
     { 
      // compare fields which makes sense 
      if (ReferenceEquals(x, y)) return 0; 
      if (ReferenceEquals(null, y)) return 1; 
      if (ReferenceEquals(null, x)) return -1; 
      var categoryComparison = string.Compare(x.Category, y.Category, StringComparison.Ordinal); 
      if (categoryComparison != 0) return categoryComparison; 
      return string.Compare(x.CreatorType, y.CreatorType, StringComparison.Ordinal); 
     } 
    } 

    public static Comparer<NaturePointObject> CategoryCreatorTypeComparer 
    { 
     get 
     { 
      return CategoryCreatorTypeComparerInstance; 
     } 
    } 

    public int SId { get; set; } 

    public string Category { get; set; } 

    //other properties 

    public string CreatorType { get; set; } 
} 
関連する問題