我有两个复杂的对象,里面有不同的类型(对象、字符串、双打等)。我想通过使用以下代码来比较它们:
myActualObject.ShouldBeEquivalentTo(myExpectedObject, options => options
.Using<double>(dbl => dbl.Subject.Should().BeApproximately(dbl.Expectation,
ABS_ERROR))
.WhenTypeIs<double>()
);
我正在尝试使用该.BeApproximately
行为比较双类型属性值,但由于一种特殊情况而无法正常工作:
有时我有一个
double.NaN
内部双精度数,并且将一个 NaN 与另一个 NaN 进行比较会给出一个断言失败(因为 BeApproximately 行为)。我怎样才能跳过比较,或者在这种情况下使它成为真的?最后,如何打印导致断言失败的对象的名称?
提前致谢。
编辑>>>>
我找到了第一种方法(感谢@Sam Holder):
myActualObject.ShouldBeEquivalentTo(myExpectedObject, options => options
.Using<double>(ctx => CompareDoubleApprox(ctx, myExpectedObject.Name))
.WhenTypeIs<double>()
);
...
public void CompareDoubleApprox(IAssertionContext<double> ctx, string Scope)
{
bool IsDoubleOrInfinite = (double.IsNaN(ctx.Expectation) || double.IsInfinity(ctx.Expectation));
bool absoluteErrorOK = Math.Abs(ctx.Subject - ctx.Expectation) < ABS_ERROR;
Execute.Assertion
.BecauseOf(ctx.Reason, ctx.ReasonArgs)
.ForCondition(IsDoubleOrInfinite || absoluteErrorOK)
.FailWith("{3}: Expected {context:double} to be {0} +/- {1} {reason}, but found {2}", ctx.Subject, ABS_ERROR, ctx.Expectation, Scope);
}
我的断言转储看起来像:
“MyObjectName”:预期成员 Foo.Bar 为 0 +/- 1E-05,但找到 1,39675
“MyObjectName”:预期成员 Foo.FooBar 为 2,07781 +/- 1E-05,但找到 2,98412
...更多断言失败...
我希望它在打印所有失败之前只打印一次objectName 。
更新>>>>
我想要的行为尚未在 github 上实现:https ://github.com/dennisdoomen/fluentassertions/issues/310 。被标记为增强。谢谢你的帮助。