2014-08-28 19 views
9

Korzystanie biegle twierdzeń, chciałbym stwierdzić, że dany ciąg zawiera jedną z dwóch ciągów:Zaawansowany twierdzenia: dochodzić jeden lub inną wartość

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 

Tylko jeżeli żadna z wartości zawarte jest twierdzenie powinien zawieść. To NIE działa (nawet nie kompiluje), ponieważ nie ma operatora Or().

ten sposób zrobić to teraz:

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

Jest gadatliwy, a „ponieważ” argument musi uzyskać tworzone ręcznie, które mają znaczący wynik.

Czy istnieje sposób, aby to zrobić w bardziej czytelny sposób? Rozwiązanie powinno mieć zastosowanie również do innych rodzajów płynnych twierdzenia jak Be(), HaveCount() etc ...

Używam FluentAssertions wersji 2.2.0.0 na .NET 3.5, jeśli to się liczy.

Odpowiedz

9

Uczyniłbym to rozszerzeniem do asercji ciągów. Coś takiego:

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); 
} 

Można nawet widelec z repository i dostarczyć mi Pull Request aby uczynić go częścią następnej wersji.

1

Można zrobić to trochę bardziej czytelne poprzez napisanie prostego rozszerzenia wyrażenie:

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

Niestety to nie pomaga z „powodu”:

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

następnie można to zrobić część wiadomości, ale myślę, że jest trochę lepiej.

+1

W rzeczywistości, gdy to się nie powiedzie, nie masz pojęcia, co jest nie tak. –

8

Czy to nie działa?

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

Pracowałem dla mnie za pomocą v3.1.229.

+0

Nie dla mnie, ponieważ nie chcę potwierdzać zawartości całego łańcucha, ale tylko faktyczna wartość częściowo zawiera jedną z wartości. – Marcel