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

标签 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"));
}

最佳答案

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

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

但请注意,由于属性是通过反射获取的,如果属性“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));

关于c# - 如何断言集合只包含一个具有给定属性值的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6204787/

相关文章:

java - Java 中字符串验证的单元测试

unit-testing - 单元测试 RavenDB

unit-testing - 使用 Resharper 从单元测试项目中记录 NHibernate 信息

c# - 如何编写测试来验证 Entity Framework 数据库第一模型

nunit - 如何让 NUnit 在第一次失败时停止执行测试

C#解决从不同数字组中选择2个数字的多种方法

具有自定义格式的 C# 通用 DateTime.ToString()

javascript - Jasmine : Timeout - Async callback was not invoked within timeout

c# - mysql表转化为List

C#,为什么我不能将域用户添加到本地组?