【问题标题】:How to assert that collection contains only one element with given property value?如何断言该集合仅包含一个具有给定属性值的元素?
【发布时间】:2011-06-01 16:47:46
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: c# unit-testing nunit constraints


    【解决方案1】:

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

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

    但请注意,由于属性是通过反射获取的,如果属性“名称”不存在,则会出现运行时错误。

    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));
    

    【讨论】:

      【解决方案2】:

      为什么不使用一点 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
      

      【讨论】:

      • 为什么不使用 LINQ 而不是 NUnit 断言呢? Assert.IsTrue(array.Where(x => x.Property("Name") == 1).Any()); Assert.IsFalse(array.Where(x => x.Property("Name") == 1 ).Any()); ;)
      • 因为在第一次测试出现问题时,断言消息将无法读取:您将收到 it was true but it was false 消息,而不是更容易理解的消息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2023-03-04
      • 2012-08-23
      • 1970-01-01
      • 2011-09-18
      • 2016-10-10
      相关资源
      最近更新 更多