首页 > 解决方案 > C# CollectionAssert.Contains (int[][], int[]) 不通过

问题描述

我要测试的函数返回int[][] aaiCluster1带有数据

aaiCluster1[0] = int[] { 1, 2 }
aaiCluster1[1] = int[] { 0 }

所以我测试使用

CollectionAssert.AreEqual (aaiCluster1[0], new int[] { 1, 2 });
CollectionAssert.AreEqual (aaiCluster1[1], new int[] { 0 });

但是顺序int[]并不重要,可能会改变,所以我想测试一下

CollectionAssert.Contains (aaiCluster1, new int[] { 1, 2 });

但这失败了。
这个命令不能评估数组的内容吗?
任何关于合适的解决方法的想法,不需要额外的辅助功能?

编辑
我必须澄清:
它是关于测试一个锯齿状数组是否包含另一个嵌套在其中的简单数组。
我还要解释什么??

编辑#2
2 个答案建议CollectionAssert.AreEquivalent已经给出并再次被删除,因为AreEquivalent这不是我要找的......它在这里不起作用。
给出了1个答案建议Sequence.whatever,而且更错误。


编辑#3
我恢复了伊戈尔对我的问题的更改,因为我觉得它们改变了太多的意思。但是,我认为他的话是一个很好的替代描述,所以这是他的文字:

所以我测试使用

CollectionAssert.AreEqual(new int[] { 1, 2 }, aaiCluster1[0]);
CollectionAssert.AreEqual(new int[] { 0 }, aaiCluster1[1]);

但是aaiCluster1(实际)中的订单是未知的,因此一旦返回的订单aaiCluster1发生变化,上述测试可能会失败。

问题

我怎么能称呼类似的东西

CollectionAssert.AreEqual(new int[] { 1, 2 }, aaiCluster1);
// CollectionAssert.AreEqual(ICollection<T> expected, ICollection<ICollection<T>> actual);

其中所有数组aaiCluster1都根据预期参数进行评估,new int[] { 1, 2 }如果至少有一个包含的数组被发现等于预期,则断言通过?

标签: c#arraysunit-testing

解决方案


aaiCluster1.ContainsArray(new int[] { 1, 2 });

static class Extensions
{
    public static bool ItemsEqual<TSource>(this TSource[] array1, TSource[] array2)
    {
        if (array1 == null && array2 == null)
            return true;
        if (array1 == null || array2 == null)
            return false;
        return array1.Count() == array2.Count() && !array1.Except(array2).Any();
    }

    public static bool ContainsArray<TSource>(this TSource[][] array1, TSource[] array2)
    {
        return array1.Any(x => x.ItemsEqual(array2));
    }
}

推荐阅读