FluentAssertions WhenTypeIs double.NaN

时间:2015-11-12 12:55:02

标签: c# unit-testing fluent-assertions

我有两个复杂的对象,里面有不同的类型(对象,字符串,双打等)。我想通过使用以下代码来比较它们:

myActualObject.ShouldBeEquivalentTo(myExpectedObject, options => options
        .Using<double>(dbl => dbl.Subject.Should().BeApproximately(dbl.Expectation,
         ABS_ERROR))
        .WhenTypeIs<double>()
    );

我正在尝试使用.BeApproximately行为比较double类型的属性值,但由于一个特殊情况而无法正常工作:

  • 有时我在double中有double.NaN,并且将NaN与另一个NaN进行比较会使断言失败(因为BeApproximately行为)。如何跳过比较,或者在这种情况下使其成立?

  • 最后,如何打印导致断言失败的对象名称?

提前致谢。

编辑&gt;&gt;&gt;&gt;

我找到了第一种方法(感谢@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 一次

UPDATE&GT;&GT;&GT;&GT;

我想要的行为尚未在github上实现:https://github.com/dennisdoomen/fluentassertions/issues/310。被标记为增强。谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在黑暗中未经测试的刺,但可能像这样的工作:

fopen("test", "r+")