2015-11-12 2 views
3

У меня есть два сложных объекта с разными типами внутри (объекты, строки, двойники и т. Д.). Я хочу, чтобы сравнить их с помощью следующего кода:FluentAssertions WhenTypeIs double.NaN

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

Я пытаюсь сравнить значения свойств двойного типа, используя .BeApproximately поведение, но не работает должным образом из-за один специальный случай:

  • Иногда у меня есть double.NaN внутри двойника, и сравнение NaN с другим NaN приводит к отказу утверждения (из-за поведения BeApproximately). Как я могу пропустить сравнение или сделать это правдой в этом случае?

  • И, наконец, как я могу напечатать имя объекта, вызвавшего ошибку утверждения?

Заранее благодарен.

EDIT >>>>

Я нашел первый подход (спасибо @ Сэм 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 >>>>

поведение я хочу еще не реализована на GitHub: https://github.com/dennisdoomen/fluentassertions/issues/310. Помечается как усовершенствование. Спасибо за вашу помощь.

ответ

3

Непроверено удар в темноте, но может что-то вроде этой работы:

myActualObject.ShouldBeEquivalentTo(myExpectedObject, options => options 
    .Using<double>(dbl => 
     { 
      if (!double.IsNaN(dbl.Subject)) 
      { 
       String errorMessage = string.Format("{0} caused the assertion to fail",myExpectedObject); 
       dbl.Subject.Should().BeApproximately(dbl.Expectation, ABS_ERROR, errorMessage); 
      } 
     }) 
    .WhenTypeIs<double>() 
); 
+0

Это работает! теперь просто нужно знать, как печатать имя объекта, из-за которого вышло утверждение. – Jose

+0

добавил пример вывода, который может работать. –

+0

Код трассировки не печатает, извините. – Jose