应该()。包含等效选项的()

时间:2012-12-17 20:38:55

标签: c# fluent-assertions

我试图断言Claim的集合包含一组预期的声明。我似乎遇到的问题是,无法检查子集并提供我自己的等效选项。

var expected = new[] {
    new Claim(ClaimTypes.Name, "joshdev"),
    new Claim(ClaimTypes.Email, "test@test.com"),
    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可能是我想要的,但是这提供了断言集合对象本身,而不是集合中的项目。

2 个答案:

答案 0 :(得分:1)

不幸的是,目前的版本尚无法实现。扩展点在那里(参见EquivalencyValidator类),但步骤列表目前是私有的。否则,您可以使用自己的实现替换EnumerableEquivalencyStep,该实现提供“包含”行为。

答案 1 :(得分: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));
    }
}

<强>更新

ShouldBe 方法中存在可选参数。

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