我试图断言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
可能是我想要的,但是这提供了断言集合对象本身,而不是集合中的项目。
答案 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