2014-08-28 2 views
9

Используя беглые утверждения, я хотел бы утверждать, что данная строка содержит либо один из двух строк:Fluent утверждение: Assert одно или другое значение

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 

Только если ни одно из значений содержатся, утверждения должен потерпеть неудачу. Это НЕ работает (даже не компилируется), так как нет оператора Or().

Это, как я сделать это сейчас:

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

Это многословным, а «потому что» аргумент должен получить созданный вручную, чтобы иметь содержательный вывод.

Есть ли способ сделать это более читаемым образом? Раствор должен также применяться к другим типам беглых утверждений, как Be(), HaveCount() и т.д ...

Я использую FluentAssertions версии 2.2.0.0 на .NET 3.5, если это имеет значение.

ответ

9

Я бы сделал расширение для строковых утверждений. Что-то вроде этого:

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

Можно даже форк repository и предоставить мне Pull Request, чтобы сделать его частью следующей версии.

1

Вы могли бы сделать его немного более удобным для чтения, написав простое расширение строки:

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

Тогда вы могли бы сделать это:

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

К сожалению, это не помогает с «почему» часть сообщения, но я думаю, что это немного лучше.

+1

Фактически, когда это не удается, вы не знаете, что случилось. –

8

Не должно ли это работать?

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

Работал для меня с использованием v3.1.229.

+0

Не для меня, потому что я не хочу утверждать все содержимое строки, но только то, что фактическое значение частично содержит одно из значений. – Marcel

Смежные вопросы