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