我的代码中有几个类是由XSD生成器工具从XSD文件定义自动生成的。这些类看起来与类似的名称非常相似,但是基于XSD模式(我们从外部供应商那里得到的),生成的类都是不同的类型。这些是相当复杂的类,有很多深嵌套的属性和枚举值。因此,我们过去经常直接使用类,因为很难用一种通用的方法来处理这些类。
但我接受了挑战,我(有点)成功了。为了避免在使用这些类时出现代码重复,我在XSD生成的文件之外使用接口定义向类中添加了属性,以防止它们在再次生成类时被覆盖,同时利用如下的部分类声明:
XSD生成类的简化示例
public partial class xsdGeneratedClass1
{
public xsdGeneratedClass1Header header { get; set }
public xsdGeneratedClass1Body body { get; set; }
}
public partial class xsdGeneratedClass2
{
public xsdGeneratedClass2Header header { get; set }
public xsdGeneratedClass2Body body { get; set; }
}接口的简化示例,其中属性还包括类型接口,我们编写这些接口是为了匹配XSD生成的类中的属性
public interface IXsdGeneratedClass
{
IXsdGeneratedClassHeader header { get; set; }
IXsdGeneratedClassBody body { get; set; }
}在XSD生成文件之外实现接口的简化示例
public partial class xsdGeneratedClass1 : IXsdGeneratedClass
{
public IXsdGeneratedClassHeader header { get; set; }
public IXsdGeneratedClassBody body { get; set; }
}
public partial class xsdGeneratedClass2 : IXsdGeneratedClass
{
public IXsdGeneratedClassHeader header { get; set; }
public IXsdGeneratedClassBody body { get; set; }
}在这个简化的示例中,这个构造允许我使用接口而不是具体的实现来处理头和正文属性,用于具有相同结构但具有不同类类型的几十个类,而无需编辑XSD工具的自动生成代码。这一切都很好,很好。
当使用流利的断言试图比较单元测试中的对象时,问题就出现了。看来,流利断言很难知道要比较实例化对象的哪些属性。在这个简单的示例中,xsdGeneratedClass1的实例化对象将具有四个属性:
<代码>G 212
我想比较的对象是头属性和主体属性与接口类型,因为只有这些属性中有实际数据。具体的类属性总是都是空的。所以我做了这样的测试:
class1.Should().BeEquivalentTo(expectedClass);但是,似乎流畅的断言总是将1的IXsdGeneratedClassHeader头与expectedClass的xsdGeneratedClass1Header头进行比较,后者为null。
我尝试过使用RespectingRuntimeTypes选项,它可以使测试通过,但是看起来它似乎没有按应有的方式对对象进行比较。如果我更改了expectedClass的header属性中的属性值(例如,我知道该属性值与class1中的属性值不匹配),则测试仍然可以通过。
我试着在网上搜索答案,我的搜索已经结束了,我基本上在思考是应该写我自己的工具,还是做一个非常多的手工断言。欧比万断言,请帮忙!
发布于 2019-09-27 09:09:04
非常感谢乔纳斯·尼鲁普!这似乎是一个缺陷,现在已经在Fluent断言的主分支中得到了修正。在此期间,有人在github的帖子中发布了一个关于工作的答案,这也适用于我。非常开心。谢谢!
在某个地方声明这个类,以便在单元测试中使用。
public class ReflectionMemberMatchingRule : IMemberMatchingRule
{
public SelectedMemberInfo Match(SelectedMemberInfo expectedMember, object subject, string memberPath, IEquivalencyAssertionOptions config) => expectedMember;
}通过将配置添加到Fluent断言中,在单元测试中使用扩展类。
AssertionOptions.AssertEquivalencyUsing(x => x.Using(new ReflectionMemberMatchingRule()));它现在像预期的那样工作!
https://stackoverflow.com/questions/58013793
复制相似问题