Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试集合是否包含基于特定属性的对象_C#_Unit Testing_Collections_Nunit_Nunit 2.5 - Fatal编程技术网

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

C# 测试集合是否包含基于特定属性的对象,c#,unit-testing,collections,nunit,nunit-2.5,C#,Unit Testing,Collections,Nunit,Nunit 2.5,我用的是NUnit2.5.7。我想根据类的一个属性测试特定类的自定义对象集合是否包含某些对象 e、 一个人为的例子 public class Person { public string Name { get; set; } public Person(string name) { Name = name; } } // ... public List<Person> GetFavouritePeople() { List&

我用的是NUnit2.5.7。我想根据类的一个属性测试特定类的自定义对象集合是否包含某些对象

e、 一个人为的例子

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);
}
公共类人物
{
公共字符串名称{get;set;}
公众人物(字符串名称)
{
名称=名称;
}
}
// ...
公共列表getFavoritePeople()
{
List FavoritePeople=新列表();
FavoritePeople.Add(新人物(“joe”));
FavoritePeople.Add(新人物(“fred”));
FavoritePeople.Add(新人(“jenny”);
回报最爱的人;
}
// ... 
[测试]
公共GetFavoritePeople()
{
List people=getFavoritePeople();
//我想测试什么,但不知道怎么做。。。
Assert.Contains(Name=“joe”,人物);
Assert.Contains(Name=“fred”,人物);
Assert.Contains(Name=“jenny”,人物);
}
虽然在这个例子中很简单,但我不想为每个人创建模拟对象并在断言中使用它们。。。我只想基于特定属性(本例中的名称)进行检查。

您可以使用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.areEquired()
之前,对两个参数调用
ToList()
,您可以使用Linq来确定是否所有预期项都在您测试的列表中,即使该列表包含您没有测试的其他项:

[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及更高版本,您可以使用:


您可以使用
Assert.That
Has.justice(1).匹配

List<Person> people = GetFavouritePeople()
Assert.That(people, Has.Exactly(1).Matches<Person>(p => p.Name == "NUnit is amazing")));
List people=getFavoritePeople()
Assert.That(people,Has.justice(1).Matches(p=>p.Name==“NUnit is mazing”));
故障消息将沿以下行显示:

应为:正好有一个项值与lambda表达式匹配
但是was:0项<[result of people.ToString()]>


@Ristogod:您使用的是哪个版本的NUnit,您的
Assert
来自哪个命名空间和程序集?AFAICT,
Assert.
仍在当前NUnit代码库中:
List<Person> people = GetFavouritePeople()
Assert.That(people, Has.Exactly(1).Matches<Person>(p => p.Name == "NUnit is amazing")));