2017-02-18 32 views
1

我想在我的收藏中聲明兩個項目,因爲我的收藏中有兩個實體。我正在嘗試的一種方法是做一個foreach循環並像下面一樣單獨聲明它們。但在這種方法中,我收藏的第二件物品會有不同的物品。我的意思是說,它是通過收藏的第一件物品,但不能用於其他物品,因爲我的第二件物品有不同的價值可以與之比較..如何聲明使用Nunit的每個收集項目

我怎樣才能以這種方式比較我的第二個項目。或者如果您有任何其他想法,請讓我知道。

foreach (var item in result.Entities) 
      { 
       Assert.AreEqual("Contractor1", item.ContractorName, "Result not found"); 
       Assert.AreEqual(1234, item.PKey, "Result not found"); 
       Assert.AreEqual("Alex", item.Name, "Result not found"); 
      } 

或有什麼我能做的就是寫,如果的foreach內的條件,如果它是第一個項目,然後用這個比較以其它方式使用其它數值

所以,這裏是我做過什麼::

foreach (var item in result.Entities) 
      { 
       if (result.Entities.First() == item) 
       { 
        // Assert First Item 
       } 
       else{ 
        //Assert second list 
       } 

      } 

,但我需要一個更好的解決方案。

回答

1

我寧願做下列方式:

  • 創造預期的效果expectedEntities
  • 列表驗證預期的結果是相同數量的實際結果result.Entities
  • 驗證在result.Entities每個元素都是相同的如預期。

事情是這樣的:

Asert.AreEqual(expectedEntities.Count(), result.Entities.Count()); 

for (var i = 0: i < expectedEntities.Count(); i++) 
{ 
    Assert.AreEqual(expectedEntities[i].PKey, result.Entities[i].PKey, "Result not found"); 
    Assert.AreEqual(expectedEntities[i].Name, result.Entities[i].Name, "Result not found"); 
} 

上面的例子可以驗證的結果是相同的,在相同的順序。

如果宥不在乎ORER可以爲每個預期元素查詢項目,檢查是不是空:

Asert.AreEqual(expectedEntities.Count(), result.Entities.Count()); 

for (var i = 0: i < expectedEntities.Count(); i++) 
{ 
    var item = result.Entities.Where(i => i.PKey == expectedEntities[i].PKey && i.Name == expectedEntities[i].Name).SingleOrDefault(); 
    Assert.IsNotNull(item); 
} 
0

你的問題是有關測試值相等的對象。

在nunit中有幾種內置方法來測試對象集合是否相等。

// Same order, same objects 
CollectionAssert.AreEqual(IEnumerable<T> expected, IEnumerable<T> actual) 

// Same objects, any order 
CollectionAssert.AreEquivalent(IEnumerable<T> expected, IEnumerable<T> actual) 

但是,只有您的對象T可以通過值進行比較,這種比較纔有效。

您可以通過重寫Equals和GetHashcode方法來定義如何比較對象。 這是一個基本的東西,你必須學會​​用.Net來感覺舒服。 而且有很多關於.Net中的平等的主題檢查這一個How to best implement Equals for custom types?