我正在使用NUnit 2.5.7。我想测试一个特定类的自定义对象的集合是否包含某些对象,基于类的属性之一。
e.g。一个人为的例子......
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);
}
虽然在这个例子中它很简单,但我不想为每个Person创建模拟对象并在断言中使用它们......我只想根据特定属性进行检查(本例中为Name)。 )
答案 0 :(得分:24)
您可以使用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
)。我通常将它包装在另一个在调用ToList()
之前在两个参数上调用CollectionAssert.AreEquivalent()
的方法中。
答案 1 :(得分:1)
您可以将Assert.That
与Has.Exactly(1).Matches
结合使用:
List<Person> people = GetFavouritePeople()
Assert.That(people, Has.Exactly(1).Matches<Person>(p => p.Name == "NUnit is amazing")));
失败消息将显示在以下行中:
预期:与lambda表达式完全匹配的一项值
但是是:0个项目<[result of people.ToString()]>
答案 2 :(得分: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));
}