2014-08-28 10 views
9

fließend Behauptungen benutzen, würde ich behaupten möchte, dass eine gegebene Zeichenfolge enthält entweder eine von zwei Strings:Fluent Behauptungen: Nimmt einen oder anderen Wert

actual.Should().Contain("oneWay").Or().Should().Contain("anotherWay"); 
// eiter value should pass the assertion. 
// for example: "you may do it oneWay." should pass, but 
// "you may do it thisWay." should not pass 

Nur wenn keiner der Werte enthalten ist, die Behauptung, sollte fehlschlagen. Dies funktioniert NICHT (nicht einmal kompilieren), da es keinen Operator Or() gibt. Diese

ist, wie ich es jetzt tun:

bool isVariant1 = actual.Contains(@"oneWay"); 
bool isVariant2 = actual.Contains(@"anotherWay"); 
bool anyVariant = (isVariant1 || isVariant2); 
anyVariant.Should().BeTrue("because blahblah. Actual content was: " + actual); 

Das ausführliche ist, und das „weil“ Argument muss manuell eine sinnvolle Ausgabe haben, erstellt bekommen.

Gibt es eine Möglichkeit, dies lesbarer zu machen? Eine Lösung soll auch auf andere fließend Behauptung Arten, wie Be(), HaveCount() usw. anwenden ...

ich FluentAssertions bin mit Version 2.2.0.0 auf .NET 3.5, wenn es ankommt.

Antwort

9

Ich würde es zu einer Erweiterung der String Assertions machen. Etwas wie folgt aus:

public static void BeAnyOf(this StringAssertions assertions, string[] expectations, string because, params string[] args) { 
    Execute.Assertion 
      .ForCondition(expectations.Any(assertions.Subject.Contains)) 
      .BecauseOf(because, args) 
      .FailWith("Expected {context:string} to be any of {0}{reason}", expectations); 
} 

Sie könnten sogar die repository Gabel und bieten mir mit einem Pull Request es Teil der nächsten Version zu machen.

1

Sie könnte es ein wenig besser lesbar durch einen einfachen String-Erweiterung zu schreiben:

public static class StringExt 
{ 
    public static bool ContainsAnyOf(this string self, params string[] strings) 
    { 
     return strings.Any(self.Contains); 
    } 
} 

Dann könnten Sie dies tun:

actual.ContainsAnyOf("oneWay", "anotherWay").Should().BeTrue("because of this reason"); 

Leider ist dies nicht mit dem „Grund“ helfen Teil der Nachricht, aber ich denke, es ist ein bisschen besser.

+1

Eigentlich, wenn dies fehlschlägt, haben Sie keine Ahnung, was los ist. –

8

Sollte das nicht funktionieren?

actual.Should().BeOneOf("oneWay", "anotherWay"); 

Arbeitete für mich mit v3.1.229.

+0

Nicht für mich, weil ich nicht den gesamten String-Inhalt behaupten will, sondern nur, dass der tatsächliche Wert teilweise einen der Werte enthält. – Marcel