流利的断言:XElement .Should().HaveValueContaining?

Posted

技术标签:

【中文标题】流利的断言:XElement .Should().HaveValueContaining?【英文标题】:Fluent Assertions: 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");
    

【问题讨论】:

【参考方案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");

元素值不包含“猫垫”

【讨论】:

以上是关于流利的断言:XElement .Should().HaveValueContaining?的主要内容,如果未能解决你的问题,请参考以下文章

流利的断言 - 如何在类型检查后正确链接

流利的断言:Be() vs Equals()

OR 条件的流利断言

为啥流利的断言失败但断言通过了枚举?

流利的断言应该大于总是通过

流畅的断言:断言一个或另一个值