如何用FluentAssertions实现不同类型的记录对象比较?
解决FluentAssertions中自定义类型与字符串的等价比较问题
你遇到的问题是WithMapping用法不对,它主要用于对象结构间的属性映射,而非不同类型值的比较逻辑覆盖。要让MyDomainPrimitive和字符串能等价比较,应该用Using+InsteadOf来指定类型转换的比较规则。
修改后的测试代码如下:
public record MyDomainPrimitive { public static MyDomainPrimitive Create(string value) => new MyDomainPrimitive { Value = value }; public string Value { get; init; } = ""; } [Fact] public void CanMap() { var complex = new { Id = MyDomainPrimitive.Create("a"), }; var simple = new { Id = "a", }; complex.Should().BeEquivalentTo(simple, opt => opt .Using<MyDomainPrimitive>(ctx => ctx.Subject.Value.Should().Be(ctx.Expectation as string)) .InsteadOf<string>()); }
代码说明:
Using<MyDomainPrimitive>(...):告诉FluentAssertions,当遇到MyDomainPrimitive类型的对象时,使用自定义的比较逻辑。ctx.Subject.Value.Should().Be(ctx.Expectation as string):取实际值(MyDomainPrimitive对象)的Value属性,和预期的字符串值做相等校验。InsteadOf<string>():明确指定这个规则适用于预期值类型是string的场景,刚好匹配你这里complex.Id(MyDomainPrimitive)和simple.Id(string)的比较场景。
这样修改后,测试就能正常通过,断言系统会自动把MyDomainPrimitive对象转换成它的Value属性,再和字符串做比较。
内容的提问来源于stack exchange,提问作者LosManos
相关产品推荐
相关产品推荐

