在nUnit中,什么相当于Hamcrest的Matchers.containsInAnyOrder(Matcher ... matchers)?

时间:2017-02-20 19:56:16

标签: java c# nunit hamcrest

我想断言ICollection包含满足约束集合的项目。对于Java Hamcrest,我会使用Matchers.containsInAnyOrder(Matcher ... matchers)。对于给定的集合,集合中的每个项目都匹配匹配器中的一个匹配器。

我很难在nUnit 3中找到一个等价物。是否存在?

2 个答案:

答案 0 :(得分:2)

你想要的是CollectionEquivalentConstraint,

  

CollectionEquivalentConstraint测试两个IEnumerables是等价的 - 它们以任何顺序包含相同的项目。如果传递的实际值没有实现IEnumerable,则抛出异常。

int[] iarray = new int[] { 1, 2, 3 };
string[] sarray = new string[] { "a", "b", "c" };
Assert.That( new string[] { "c", "a", "b" }, Is.EquivalentTo( sarray ) );
Assert.That( new int[] { 1, 2, 2 }, Is.Not.EquivalentTo( iarray ) );

如果您需要更多详细信息,请查看https://github.com/nunit/docs/wiki/CollectionEquivalentConstraint

上的文档

答案 1 :(得分:0)

好的。我对此实施了一个灵活的答案。关键是创建一个IComparer,它将比较约束和对象。它看起来像这样:

/// <summary>
/// A Comparer that's appropriate to use when wanting to match objects with expected constraints.
/// </summary>
/// <seealso cref="System.Collections.IComparer" />
public class ConstraintComparator : IComparer
{
    public int Compare(object x, object y)
    {
        var constraint = x as IConstraint;

        var matchResult = constraint.ApplyTo(y);

        return matchResult.IsSuccess ? 0 : -1;
    }
}

然后我可以执行以下操作:

Assert.That(actual, Is.EquivalentTo(constraints).Using(new ConstraintComparator()));