首页 > 解决方案 > 使用 Fluent 断言比较具有多个同名元素的 XML 文件

问题描述

我正在尝试检查我生成的 xml 文件的元素。我使用 Fluent Assertions,并且我确信必须有一种方法可以通过仅提供一个参数来断言“此元素存在于文档中”。

出于测试目的,我需要知道某些元素是否仍然存在。

我知道我可以将文件与现有文件进行比较。问题是,我知道我的 xml 文件不会保持一致,一些元素可能会被移动,或者它们的一些参数可能会改变。但不是全部。

假设这是我的 xml 文件:

<tools>
    <tool name="AA" description="AhAh">5</tool>
    <tool name="BB" description="BBBB" detail="Bexample">15</tool>
    <tool name="CC">12</tool>
</tools>

我知道名称为“BB”的元素将来不会被删除我想以这种方式检查它:

var tools = xml.XPathSelectElements(".//tools//tool");
var containedElement = new XElement("tools")
                new XElement("tool", new XAttribute("name", "BB")));

//Here is what I have tried so far
using (new AssertionScope())
{
     tools.Should().HaveElement("tool").Which.Should().HaveAttribute("name", "BB");
     tools.Should().BeEquivalentTo(containedElement);
     tools.Should().ContainEquivalentOf(containedElement);
}

但是,如果在他之前的另一个元素具有相同的元素名称,我似乎无法在不指定其在节点中的位置的情况下检查元素。

Message: Expected attribute "name" at "/tool" to have value "BB", but found "AA".

有没有人有解决这个问题的想法?谢谢您的帮助

标签: c#xmlfluent-assertions

解决方案


与其试图强迫框架做它不能做的事情,不如考虑另一种方法

var xml = @"
<tools>
    <tool name=""AA"" description=""AhAh"">5</tool>
    <tool name=""BB"" description=""BBBB"" detail=""Bexample"">15</tool>
    <tool name=""CC"">12</tool>
</tools>";

XElement tools = XElement.Parse(xml); //For demonstration purposes only

XElement expected = XElement.Parse(@"<tool name=""BB"" description=""BBBB"" detail=""Bexample"">15</tool>");

tools.Elements()
    .FirstOrDefault(e => e.Attributes("name").Any(a => a.Value == "BB"))
    .Should().NotBeNull()
    .And.BeEquivalentTo(expected);

上面的示例尝试找到所需的元素,然后对其进行断言


推荐阅读