2

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

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::EqualsClaim类型未实现的方法。

我需要的是某种方法,但具有与暴露Contain相同的等效选项。ShouldAllBeEquivalentTo我想也许ShouldBeEquivalentTo会是我想要的,但这提供了断言集合对象本身,而不是集合中的项目。

4

2 回答 2

2

不幸的是,这在当前版本中还不可能。扩展点在那里(请参阅EquivalencyValidator类),但步骤列表当前是私有的。否则,您可以将EnumerableEquivalencyStep替换为您自己的提供“包含”行为的实现。

于 2012-12-18T16:45:49.423 回答
2

如果您使用Shouldly,则可以将ShouldAllBeContains一起使用。

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
于 2017-11-14T15:14:32.733 回答