2014-08-28 13 views
9

Utilizzando asserzioni fluenti, desidero affermare che una determinata stringa contiene uno di due stringhe:asserzioni fluente: asserire uno o un altro valore

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 

Solo se nessuno dei valori è contenuto, l'asserzione dovrebbe fallire. Questo NON funziona (nemmeno compilando) in quanto non esiste un operatore Or().

Questo è come lo faccio ora:

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

Questa è prolisso, e il "perché" argomento deve ottenere creato manualmente per avere un output significativo.

C'è un modo per farlo in un modo più leggibile? Una soluzione dovrebbe applicarsi anche ad altri tipi di asserzione fluenti, come Be(), ecc ... HaveCount()

Sto usando la versione 2.2.0.0 FluentAssertions su .NET 3.5, se quello che conta.

risposta

9

Farei un'estensione alle asserzioni di stringa. Qualcosa di simile a questo:

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

si potrebbe anche sborsare il repository e mi fornire una Pull Request per renderlo parte della prossima versione.

1

Si potrebbe rendere un po 'più leggibile scrivendo una semplice estensione stringa:

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

allora si potrebbe fare questo:

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

Purtroppo questo non risolve il problema con la "ragione" parte del messaggio, ma penso che sia un po 'meglio.

+1

In realtà, quando questo non funziona, non hai idea di cosa non funzioni. –

8

Non dovrebbe funzionare?

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

Ha funzionato per me utilizzando la v3.1.229.

+0

Non per me, perché non voglio affermare l'intero contenuto della stringa, ma solo che il valore reale contiene parzialmente uno dei valori. – Marcel