首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FluentAssertions -比较包含具有相似名称但类型不同的属性的对象

FluentAssertions -比较包含具有相似名称但类型不同的属性的对象
EN

Stack Overflow用户
提问于 2019-09-19 14:53:57
回答 1查看 924关注 0票数 1

我的代码中有几个类是由XSD生成器工具从XSD文件定义自动生成的。这些类看起来与类似的名称非常相似,但是基于XSD模式(我们从外部供应商那里得到的),生成的类都是不同的类型。这些是相当复杂的类,有很多深嵌套的属性和枚举值。因此,我们过去经常直接使用类,因为很难用一种通用的方法来处理这些类。

但我接受了挑战,我(有点)成功了。为了避免在使用这些类时出现代码重复,我在XSD生成的文件之外使用接口定义向类中添加了属性,以防止它们在再次生成类时被覆盖,同时利用如下的部分类声明:

XSD生成类的简化示例

代码语言:javascript
复制
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生成的类中的属性

代码语言:javascript
复制
public interface IXsdGeneratedClass
{
    IXsdGeneratedClassHeader header { get; set; }
    IXsdGeneratedClassBody body { get; set; }
}

在XSD生成文件之外实现接口的简化示例

代码语言:javascript
复制
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的实例化对象将具有四个属性:

  1. 公共xsdGeneratedClass1Header头{ get;set }
  2. 公共xsdGeneratedClass1Body主体{ get;set;}
  3. 公共IXsdGeneratedClassHeader标头{ get;set;}
  4. 公共IXsdGeneratedClassBody标头{ get;set;}

<代码>G 212

我想比较的对象是头属性和主体属性与接口类型,因为只有这些属性中有实际数据。具体的类属性总是都是空的。所以我做了这样的测试:

代码语言:javascript
复制
class1.Should().BeEquivalentTo(expectedClass);

但是,似乎流畅的断言总是将1的IXsdGeneratedClassHeader头与expectedClass的xsdGeneratedClass1Header头进行比较,后者为null。

我尝试过使用RespectingRuntimeTypes选项,它可以使测试通过,但是看起来它似乎没有按应有的方式对对象进行比较。如果我更改了expectedClass的header属性中的属性值(例如,我知道该属性值与class1中的属性值不匹配),则测试仍然可以通过。

我试着在网上搜索答案,我的搜索已经结束了,我基本上在思考是应该写我自己的工具,还是做一个非常多的手工断言。欧比万断言,请帮忙!

EN

回答 1

Stack Overflow用户

发布于 2019-09-27 09:09:04

非常感谢乔纳斯·尼鲁普!这似乎是一个缺陷,现在已经在Fluent断言的主分支中得到了修正。在此期间,有人在github的帖子中发布了一个关于工作的答案,这也适用于我。非常开心。谢谢!

在某个地方声明这个类,以便在单元测试中使用。

代码语言:javascript
复制
public class ReflectionMemberMatchingRule : IMemberMatchingRule
{
    public SelectedMemberInfo Match(SelectedMemberInfo expectedMember, object subject, string memberPath, IEquivalencyAssertionOptions config) => expectedMember;
}

通过将配置添加到Fluent断言中,在单元测试中使用扩展类。

代码语言:javascript
复制
AssertionOptions.AssertEquivalencyUsing(x => x.Using(new ReflectionMemberMatchingRule()));

它现在像预期的那样工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58013793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档