2017-10-24 12 views
1

현재 복사 기능에 대한 단위 테스트를하고 있으며 이전 목록과 새로 복사 한 목록 사이의 개체 요소를 비교해야합니다. 잘 작동하지만 for 루프가 포함되지 않은 방식으로 처리 할 수 ​​있는지 궁금합니다. 여기 내 객체입니다Assert 두 개의 개체 목록을 같습니다 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을 살펴볼 수 있습니다.이 도구는 너겟 패키지로 제공됩니다. – 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; } 
}