问题描述
我一直在搞弄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>
。