我刚刚发现了这个漂亮的工具XmlUnit,它允许我评估2个不同的XML文档并显示最终的差异。
string control = "<a><b attr=\"abc\"></b></a>";
string test = "<a><b attr=\"xyz\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
Assert.IsFalse(myDiff.HasDifferences(), myDiff.ToString());
但是,我发现myDiff.ToString()
只显示遇到的第一个差异。
有没有办法全部显示它们?
答案 0 :(得分:0)
我刚刚找到解决方案
Assert.IsFalse(myDiff.HasDifferences(), string.Join(Environment.NewLine, myDiff.Differences));
答案 1 :(得分:0)
我假设您使用的是xmlunit.net 库(您没有说出您找到的工具的名称,但您的示例似乎匹配)。
您可以搜索他们的GitHub仓库并找到DiffBuilder类文件。如果查看Build方法,您将看到它返回Diff对象。如果你转到Diff类文件,你会发现它的ToString方法看起来像这样。
public override string ToString() {
return ToString(formatter);
}
这并没有告诉你很多,但如果你去另一个ToString重载,你会发现这个。
public string ToString(IComparisonFormatter formatter) {
if (!HasDifferences()) {
return "[identical]";
}
return differences.First().Comparison.ToString(formatter);
}
现在我们到了某个地方。我们现在知道Diff在私有差异字段中存储差异列表,以及为什么ToString()只返回一个差异(TheFirst()调用)。如果你查看该类,你会发现有一个名为Differences的公共属性,它将该字段公开为IEnumerable。因此,获得所有差异的方法是循环遍历该属性并收集所有这些属性。
string control = "<a><b attr=\"abc\" attr2=\"123\"></b></a>";
string test = "<a><b attr=\"xyz\" attr2=\"987\"></b></a>";
var myDiff = DiffBuilder.Compare(Input.FromString(control))
.WithTest(Input.FromString(test))
.Build();
var sb = new StringBuilder();
foreach(var dif in myDiff.Differences)
{
sb.AppendLine(dif.Comparison.ToString());
}
Assert.IsFalse(myDiff.HasDifferences(), sb.ToString());
请注意,我获得了格式化Diff类的ToString代码差异的语法。另请注意,我在示例中添加了第二个属性,以证明这确实显示了所有差异。