2017-02-18 65 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?