2014-08-28 17 views
9

akıcı iddialarını kullanarak, ya belirli bir dize içerdiğini iddia etmek istiyorum iki dizelerinden biri:Akıcı iddialar: Bir VEYA başka bir değeri Assert

değerlerin hiçbiri bulunan Sadece eğer
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 

, iddianın başarısız olmalıdır. Hiçbir Or() operatör olmadığı için bu (hatta derlemek değil) işe DEĞİLDİR.

Şu ana böyle yaparız:

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

ve argüman anlamlı çıkışı için el ile oluşturulan almak gerekir "çünkü".

daha okunabilir bir biçimde bunu yapmanın bir yolu var mı? Ben .NET 3.5 üzerinde FluentAssertions versiyon 2.2.0.0 kullanıyorum

bu konularda bir çözüm ayrıca, ... Be(), HaveCount() vb gibi diğer akıcı iddia türleri için geçerli olmalıdır.

cevap

9

Ben dize iddialarının bir uzantısı olur. Böyle bir şey:

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

Hatta repository çatal ve bir sonraki sürümünün bir parçası yapmak için bir Pull Request bana verebilir.

1

Bunu biraz daha okunabilir bir basit dize uzantısı yazarak yapabiliriz:

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

Ne yazık ki bu "akıl" ile yardımcı olmuyor:

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

Sonra bu yapabileceğini Mesajın bir parçası, ama bence biraz daha iyi.

+1

Aslında, sorunun nerede olduğunu hiçbir ipucu var. Benim için –

8

bu işi değildir mıyım? Benim için v3.1.229'u kullanarak çalıştım

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

. Bu başarısız olduğunda

+0

, ben bütün dize içeriği iddia etmek istemiyorum, ama gerçek değeri kısmen değerlerden biri içerdiği sadece çünkü. – Marcel

İlgili konular