微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FluentAssertions是否可以等效于c#9记录类型?

如何解决FluentAssertions是否可以等效于c#9记录类型?

我一直在搞弄c#9的一些新功能,并且遇到了一些有趣的事情。如果我尝试在具有DateTimeOffset的记录上使用Should()。BeEquivalentTo(),将DateTimeOffset的Using选项设置为使用BeCloseto,则即使DateTimeOffset在允许的精度范围内,测试也会失败。有没有办法使它工作(不将记录更改为大声笑)?非常感谢!

示例:

   public class ExampleTest
   {

      [Fact]
      public void FunWithRecords()
      {
         var thing1 = new Thing
         {
            SomeDate = DateTimeOffset.UtcNow
         };
         var thing2 = new Thing
         {
            SomeDate = DateTimeOffset.UtcNow.AddSeconds(2)
         };
         thing1.Should().BeEquivalentTo(thing2,o =>
            o.Using<DateTimeOffset>(ctx =>
               ctx.Subject.Should().BeCloseto(ctx.Expectation,10000))
               .WhenTypeIs<DateTimeOffset>());
      }
   }
   
   public record Thing
   {
      public DateTimeOffset SomeDate {get; init;}
   }

解决方法

Aaaaand我回答了我自己的问题。这样就可以了:

thing1.Should().BeEquivalentTo(thing2,o => o
         .ComparingByMembers<Thing>()
         .Using<DateTimeOffset>(ctx => 
               ctx.Subject.Should().BeCloseTo(ctx.Expectation,10000)).WhenTypeIs<DateTimeOffset>());
,

Fluent断言确实支持记录。 它们是由编译器生成的“普通”常规类

  • 基于价值的平等比较方法
  • 覆盖GetHashCode()
  • 复制和克隆成员
  • PrintMembers和ToString()

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#record-types

默认情况下,BeEquivalentTo如果在期望类型上被覆盖以比较实例,则使用object.Equals。 从普通类切换到记录时,该类型现在将覆盖object.Equals,从而更改了比较实例的方式。 要覆盖该默认行为,您可以使用ComparingByMembers<T>

https://fluentassertions.com/objectgraphs/#value-types

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。