2012-12-17 28 views
1

我試圖斷言集合Claim包含一組預期的索賠。我似乎遇到的問題是,無法檢查子集並提供我自己的等同選項。應該()。包含()與等價選項

var expected = new[] { 
    new Claim(ClaimTypes.Name, "joshdev"), 
    new Claim(ClaimTypes.Email, "[email protected]"), 
    new Claim(ClaimTypes.GivenName, "Josh"), 
    new Claim(ClaimTypes.Surname, "Perry"), 
}; 

var identity = GetIdentity(); 

我已經試過......

identity.Claims.ShouldAllBeEquivalentTo(expected, options => options.Including(x => x.Type).Including(x => x.Value)); 

如果身份的說法是不準確的預期設定的,例如這將失敗不僅僅是這些索賠。

identity.Claims.Should().Contain(expected); 

失敗的原因Contain只需使用object::Equals方法將Claim型沒有實現。

我需要的是一些方法來做Contain但與ShouldAllBeEquivalentTo曝光相同的等效選項。我想也許ShouldBeEquivalentTo將是我想要的,但它提供了斷言集合對象本身,而不是集合中的項目。

+0

如何定義兩個「Claim」是否相等?所有領域相同或只是一組「關鍵」字段? –

+0

在這個特定的測試用例中,「Equal」只意味着'Type'和'Value'屬性是相等的。 (請參閱第一個斷言,'options.Including ...')理想情況下,我希望能夠提供像ShouldAllBeEquivalentTo這樣的等價選項,但具有「Contains」的語義,或者以某種方式指定類似於「IEqualityComparer ' 。 – joshperry

回答

1

不幸的是,這在當前版本中尚不可行。擴展點在那裏(請參見EquivalencyValidator類),但步驟列表當前是私有的。否則,你可以用你自己的提供「包含」行爲的實現替換EnumerableEquivalencyStep

0

如果使用Shouldly,您可以使用ShouldAllBe包含

collection1 = {1, 2, 3, 4}; 
collection2 = {2, 4, 1, 3}; 

collection1.ShouldAllBe(item=>collection2.Contains(item)); // true 

最後,你可以寫一個擴展。

public static class ShouldlyIEnumerableExtensions 
{ 
    public static void ShouldEquivalentTo<T>(this IEnumerable<T> list, IEnumerable<T> equivalent) 
    { 
     list.ShouldAllBe(l => equivalent.Contains(l)); 
    } 
} 

UPDATE

一個可選參數,存在於shouldBe這樣方法。

collection1.ShouldBe(collection2, ignoreOrder: true); // true 
+0

我剛剛在[最新版本](https://github.com/shouldly/shouldly/issues/340#issuecomment-166708101)上發現在** ShouldBe **方法上有一個參數'bool ignoreOrder'。 –