【问题标题】:Fluent Assertions: XElement .Should().HaveValueContaining?流利的断言:XElement .Should().HaveValueContaining?
【发布时间】:2021-01-18 05:28:38
【问题描述】:

我想测试一个 XML 元素的值是否包含一个特定的字符串。 [下面的代码显然是高度人为的,而不是来自我正在处理的真实代码库]。如何使用 Fluent Assertions 检查 XElement 的值是否包含字符串?

using System.Xml.Linq;
using FluentAssertions;

class Program
{
    private static void Main()
    {
        var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
        x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");

        // don't know how to do this:
        x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat");
    }
}

【问题讨论】:

    标签: c# fluent-assertions


    【解决方案1】:

    您的 XML 节点的值只是一个字符串,由空格分隔的多个“条目”在 XML 中没有什么特别之处 - 所以我们需要将此断言视为普通字符串。

    x.Should().HaveElement("Name").Which.Value.Split(' ').Should().Contain("Cat");
    

    这里的重要区别是.Which.Value,所以我们只断言节点的值(它是一个字符串),而不是整个节点。从那里,您可以按空格分隔,然后检查结果集合是否包含您要查找的条目之一。

    【讨论】:

      【解决方案2】:

      FluentAssertions 可以扩展,所以你可以添加一个扩展方法来检查文本是否包含在值中:

      public static class FluentExtensions {
          public static AndConstraint<XElementAssertions> HaveValueContaining(this XElementAssertions element, string text) {
              {
                  Execute.Assertion
                      .ForCondition(element.Subject.Value.Contains(text))
                      .FailWith($"Element value does not contain '{text}'");
      
                  return new AndConstraint<XElementAssertions>(element);
              }
          }
      }
      

      那么这个测试就通过了:

      [Test]
      public void Test() {
          var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
          x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");
      
          x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat");
          x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat Sat");
      }
      

      而且这个测试会失败:

      [Test]
      public void Test() {
          var x = new XElement("Root", new XElement("Name", "Fat Cat Sat"));
          x.Should().HaveElement("Name").Which.Should().HaveValue("Fat Cat Sat");
      
          x.Should().HaveElement("Name").Which.Should().HaveValueContaining("Cat Mat");
      }
      

      元素值不包含“猫垫”

      【讨论】:

        猜你喜欢
        • 2020-02-08
        • 2014-07-27
        • 2018-06-25
        • 2021-12-28
        • 2018-12-01
        • 2020-08-16
        • 2016-04-11
        • 2015-09-23
        • 2021-01-08
        相关资源
        最近更新 更多