c# - 使用 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".
有没有人有解决这个问题的想法?谢谢您的帮助
解决方案
与其试图强迫框架做它不能做的事情,不如考虑另一种方法
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);
上面的示例尝试找到所需的元素,然后对其进行断言
推荐阅读
- ios - 应用程序调试启动非常慢,可能与“lldb-rpc-server”有关?
- android - Facebook Login dialog disappears after clicking on Facebook sign in button
- go - file not found / unable to import package
- python - Flask form TypeError: object of type 'int' has no len()
- c# - Trying to create a highest bidder WPF program in C# using Visual Studio
- django - 网站说在没有 www 的情况下打开时连接不安全,但使用 www 可以正常工作。我正在使用 https
- cplex - CPLEX/OPL model for transshipment (network flow)
- c# - Get last saved row in my database every fixed time period and update view
- typescript - Can I somehow define what can be the indexed name in the interface based on another interface in TypeScript?
- javascript - Want to incorporate progress bar when uploading file using Google.Apis.Drive.v3 with C# MVC 5