У меня есть два сложных объекта с разными типами внутри (объекты, строки, двойники и т. Д.). Я хочу, чтобы сравнить их с помощью следующего кода: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. Помечается как усовершенствование. Спасибо за вашу помощь.
Это работает! теперь просто нужно знать, как печатать имя объекта, из-за которого вышло утверждение. – Jose
добавил пример вывода, который может работать. –
Код трассировки не печатает, извините. – Jose