繁体   English   中英

测试集合是否包含基于特定属性的对象

[英]Testing if a collection contains objects based on a particular property

我正在使用 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);
}

虽然在这个例子中它很简单,但我不想为每个 Person 创建模拟对象并在断言中使用它们......我只想根据特定的属性(在这个例子中为 Name )进行检查。

你可以使用 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()方法中。

您可以将Assert.ThatHas.Exactly(1).Matches结合使用:

List<Person> people = GetFavouritePeople()
Assert.That(people, Has.Exactly(1).Matches<Person>(p => p.Name == "NUnit is amazing")));

失败消息将沿着以下几行:

预期:正好与 lambda 表达式匹配的一项值
但是是:0 项 < [people.ToString() 的结果] >

您可以使用 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)); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM