微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

流利的断言:XElement .ShouldHaveValueContaining?

如何解决流利的断言:XElement .ShouldHaveValueContaining?

我想测试XML元素的值是否包含特定字符串。 [下面的代码显然是人为设计的,而不是我正在研究的真实代码库]。如何使用Fluent断言检查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");
    }
}

解决方法

您的XML节点的值只是一个字符串,用空格分隔的多个“条目”在XML中并不是什么特别的东西-因此我们需要将此断言视为普通的字符串。

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

这里的重要区别是.Which.Value,因此我们仅根据节点的值(它是字符串)而不是 entire 节点进行断言。从那里,您可以按空格分割,然后检查结果集合是否包含您要查找的条目之一。

,

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

User.Identity?.IsAuthenticated

然后该测试将通过:

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

元素值不包含“猫垫”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。