Wie kann ich null und String vergleichen.Leer (oder "") in fließenden Behauptungen?
-
21-12-2019 - |
Frage
Ich habe zwei Objekte desselben Typs, der Typ hat ein Zeichenfolgenfeld, im ersten Objekt ist der Wert null, im zweiten ist der Wert "". Wie kann ich fließende Bewertungen dazu zwingen, anzunehmen, dass dies korrekt ist?
Bewertung selbst:
callResult.ShouldBeEquivalentTo(centreResponse,
opt => opt.Excluding(r => r.DateOpen));
hier wird die Ausnahme ausgelöst, die besagt, dass der erwartete Wert null ist, der echte ist "" (oder umgekehrt)
Lösung
Sie können das Verhalten für Eigenschaften vom Typ überschreiben string
wie das:
callResult.ShouldBeEquivalentTo(centreResponse, opt => opt
.Excluding(r => r.DateOpen)
.Using<string>(ctx => CompareStrings(ctx)).WhenTypeIs<string>());
public void CompareStrings(IAssertionContext<string> ctx)
{
var equal = (ctx.Subject ?? string.Empty).Equals(ctx.Expectation ?? string.Empty);
Execute.Assertion
.BecauseOf(ctx.Because, ctx.BecauseArgs)
.ForCondition(equal)
.FailWith("Expected {context:string} to be {0}{reason}, but found {1}", ctx.Subject, ctx.Expectation);
}
Sie können dies ein wenig bereinigen, indem Sie das einkapseln CompareStrings
verfahren bei einer Implementierung von IAssertionRule
.Sehen Sie die RelaxingDateTimeAssertionRule
in den Unit-Tests von FluentAssertions hier.
Sie können diese benutzerdefinierte Zusicherungsregel als Standard für alle Zusicherungen zu Ihrem Typ hinzufügen callResult
variabel, aber ich muss noch etwas hinzufügen, um globale Standardeinstellungen zuzulassen.