如何断言该集合只包含一个具有给定属性值的元素?

时间:2011-06-01 16:47:46

标签: c# unit-testing nunit constraints

如何断言该集合只包含一个具有给定属性值的元素?

例如:

class Node
{
  private readonly string myName;
  public Node(string name)
  {
    myName = name;
  }
  public string Name { get; set; }
}

[Test]
public void Test()
{
  var array = new[]{ new Node("1"), new Node("2"), new Node("1")};
  Assert.That(array, Has.Some.Property("Name").EqualTo("1"));
  Assert.That(array, Has.None.Property("Name").EqualTo("1"));

  // and how to assert that node with Name="1" is single?
  Assert.That(array, Has.???Single???.Property("Name").EqualTo("1"));
}

2 个答案:

答案 0 :(得分:17)

1:您可以使用Has.Exactly()约束:

Assert.That(array, Has.Exactly(1).Property("Name").EqualTo("1"));

但请注意,由于Property是通过反射得到的,如果属性“Name”不存在,您将收到运行时错误。

2:(推荐)但是,通过谓词而不是字符串来获取属性会更好。如果属性名称不存在,您将收到编译错误:

Assert.That(array, Has.Exactly(1).Matches<Node>(x => x.Name == "1"));    

3:或者,你可以依靠Count方法:

Assert.That(array.Count(x => x.Name == "1"), Is.EqualTo(1));

答案 1 :(得分:1)

为什么不使用一点LINQ?

Assert.IsTrue(array.Single().Property("Name").EqualTo("1")); // Single() will throw exception if more then one

Assert.IsTrue(array.Count(x => x.Property("Name").EqualTo("1") == 1); // will not