.net FluentAssertions不会排除对象图比较中的缺失成员

kuarbcqp  于 2023-01-27  发布在  .NET
关注(0)|答案(3)|浏览(96)

我正尝试使用FluentAssertionsx 1 e0f1x比较DTO与其相应的实体。我的实体有一些额外的元数据属性,而我的DTO没有。
我尝试使用ExcludingMissingMembers选项排除这些额外的属性,甚至显式地排除每个成员本身,如下所示:

result.Entity.Should().BeEquivalentTo(dto, opt => opt
  .ExcludingMissingMembers()
  .Excluding(x => x.ValidationResult)
  .Excluding(x => x.CreatedBy)
  .Excluding(x => x.CreatedAt));

但是由于DTO不具有的额外属性,我的测试总是失败。
消息:预期结果。要使用的实体(类型为Entity)
实体
{
创建时间=〈0001-01-01 00:00:00.000〉
创建人=
财务资源来源= {人工,人工}
感兴趣的产品= {固定收益,固定收益}
确认结果=
},但找到
德托
{
财务资源来源= {人工,人工}
感兴趣的产品= {固定收益,固定收益}
}
配置:

  • 使用声明的类型和成员
  • 按值比较枚举
  • 排除成员验证结果
  • 排除成员创建者
  • 排除成员创建于
  • 按名称(或引发)匹配成员
  • 严格控制字节数组中项的顺序
  • 没有自动转换。

我错过了什么?

tez616oj

tez616oj1#

因此,快速测试结果:

var entity = new
    {
        CreatedAt = DateTime.Now,
        CreatedBy = "",
        FinancialResourcesOrigins = new[] { "Labor", "Labor" },
        ProductsOfInterest = new[] { "FixedIncome", "FixedIncome" },
        ValidationResult = ""
    };

var dto = new
    {
        FinancialResourcesOrigins = new[] { "Labor", "Labor" },
        ProductsOfInterest = new[] { "FixedIncome", "FixedIncome" },
    };

entity.Should()
     .BeEquivalentTo(dto, opt => opt
     .ExcludingMissingMembers());

这应按预期工作。
您的错误似乎是显式exclude,因为成员(变量x)应该来自DTO,而在DTO中它们并不存在

pexxcrt2

pexxcrt22#

来自ExcludingMissingMembers()的源代码:
尝试将主题的成员与期望中同名的成员进行匹配。忽略期望中不存在的那些成员以及以前注册的匹配规则。
在您的场景中,“expectation”是dto对象,因为entity(subject)具有dto对象的所有属性,所以没有什么可忽略的。
您可以通过交换dtoentity的位置来获得所需的结果

dto.Should().BeEquivalentTo(result.Entity, opt => opt.ExcludingMissingMembers());

交换位置后,entity变为“期望值”,dto(主题)上缺少的属性将被忽略
然而,这种方法使失败消息有点混乱,例如,当result.Entitynull时,消息将是:* 实体应为,但找到的是Dto {..}*

a64a0gku

a64a0gku3#

流体Assert6.8.0

actualValue.Should().BeEquivalentTo(expectedValue, options
            => options.Using(new IgnoreNullMembersInExpectation()));

public class IgnoreNullMembersInExpectation : IEquivalencyStep
{
    public EquivalencyResult Handle(Comparands comparands, IEquivalencyValidationContext context, IEquivalencyValidator nestedValidator)
    {
        if(comparands.Expectation is null)
        {
            return EquivalencyResult.AssertionCompleted;
        }

        return EquivalencyResult.ContinueWithNext;
    }
}

相关问题