C#CollectionAssert.Contains(int [] [],int [])不通过

时间:2018-07-24 15:09:59

标签: c# arrays unit-testing

我要测试的函数返回带有数据的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
我将Igor的更改恢复为我的问题,因为我觉得它们太多地改变了含义。但是,我认为他的话是一个很好的替代描述,所以这是他的文字:

所以我测试使用

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 }进行评估,并且如果找到至少一个包含的数组等于预期值,则断言通过?

2 个答案:

答案 0 :(得分:0)

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));
    }
}

答案 1 :(得分:-1)

如果要确保现场完全包含另一个,则可以使用linq,假设没有重复项,您可以这样做:

Assert.IsTrue(new int[] { 1, 2 }.Except(aaiCluster1[0]).Count() == 0);