2011-02-23 33 views
11

我正在使用NUnit 2.5.7。我想测试某个特定类的自定义对象的集合是否包含某些基于类的属性的对象。测试集合是否包含基于特定属性的对象

例如一个人为的例子...

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

// ... 

public List<Person> GetFavouritePeople() 
{ 
    List<Person> favouritePeople = new List<Person>(); 
    favouritePeople.Add(new Person("joe")); 
    favouritePeople.Add(new Person("fred")); 
    favouritePeople.Add(new Person("jenny")); 

    return favouritePeople; 
} 

// ... 

[Test] 
public GetFavouritePeople() 
{ 
    List<Person> people = GetFavouritePeople(); 

    // What I'd like to test, but not sure how to do it... 
    Assert.Contains(Name="joe", people); 
    Assert.Contains(Name="fred", people); 
    Assert.Contains(Name="jenny", people); 
} 

虽然它会在这个例子很简单,我不希望每个人创建模拟对象,并断言使用这些......我只是想检查依据在一个特定的属性(名称在这个例子中)

回答

19

你可以使用LINQ:

Assert.That(people.Any(p => p.Name == "joe")); 

,或者,如果你想更加明确一些有确切地说是一个人与每个名称:

Assert.That(people.Count(p => p.Name == "joe"), Is.EqualTo(1)); 

如果您想要比“断言失败,预期真实,错误”更好的错误消息,则可以创建自己的断言方法。

对于几个与集合有关的断言,CollectionAssert非常有用 - 例如,它允许您检查两个集合是否包含相同的元素,而不管它们的顺序如何。因此,另一种可能性是:

CollectionAssert.AreEquivalent(new[] {"joe", "fred", "jenny"}, people.Select(p => p.Name).ToList()); 

注意CollectionAssert.AreEquivalent()是有点挑剔关于它接受类型(即使签名采用IEnumerable)。我通常在调用CollectionAssert.AreEquivalent()之前用另一种方法在两个参数上调用ToList()

0

您可以使用LINQ的Intersect()确定所有预期的项目是否是列表中您的测试对即使列表中包含的其他项目,你是不是测试为:

[Test] 
public void TestFavouritePeople() 
{ 
    var people = GetFavouritePeople(); 
    var names = people.Select(p => p.Name); 

    var expectedNames = new[] {"joe", "fred", "jenny"}; 
    var actualNames = names.Intersect(expectedNames); 

    CollectionAssert.AreEquivalent(expectedNames, actualNames); 
} 

对于NUnit的3.0和更大,您可以使用Is.SupersetOf()

[Test] 
public void TestFavouritePeople() 
{ 
    var people = GetFavouritePeople(); 
    var names = people.Select(p => p.Name); 

    var expectedNames = new[] {"joe", "fred", "jienny"}; 
    var actualNames = names; 

    Assert.That(actualNames, Is.SupersetOf(expectedNames)); 
} 
相关问题