【问题标题】:Assert that arrays are equal in Visual Studio 2008 test framework在 Visual Studio 2008 测试框架中断言数组是相等的
【发布时间】:2010-10-28 04:58:43
【问题描述】:

是否有一种简单的方法可以在单元测试中检查两个数组是否相等(即具有相同数量的元素,并且每个元素都相同?)。

在 Java 中,我会使用 assertArrayEquals (foo, bar);,但似乎没有 C# 的等价物。我试过Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));,但即使函数返回一个带有“a”、“b”的数组,检查仍然失败

这是使用带有内置单元测试框架的 Visual Studio 2008 Team Suite。

【问题讨论】:

    标签: c# visual-studio-2008 unit-testing


    【解决方案1】:

    Class1.cs:

    
    namespace ClassLibrary1
    {
        public class Class1
        {
            Array arr1 = new[] { 1, 2, 3, 4, 5 };
            public Array getArray()
            {
                return arr1;
            }
        }
    }
    

    ArrayEqualTest.cs:

    
            [TestMethod()]
            public void getArrayTest()
            {
                Class1 target = new Class1(); 
                Array expected = new []{1,2,3,4,5}; 
                Array actual;
                actual = target.getArray();
                CollectionAssert.AreEqual(expected, actual);
                //Assert.IsTrue(expected.S actual, "is the test results");
            }
    

    测试成功,发现错误:

    
       CollectionAssert.AreEqual failed. (Element at index 3 do not match.)
    

    【讨论】:

    • 该死,我不小心对这个答案投了反对票,现在我无法撤消我的反对票 - 我得到“你的投票现在被锁定,除非这个答案被编辑”:(
    • 这个答案看起来并不比前一年的好。
    【解决方案2】:

    好的,这里有一个稍微长一点的方法......

    static void Main(string[] args)
    {
        var arr1 = new[] { 1, 2, 3, 4, 5 };
        var arr2 = new[] { 1, 2, 4, 4, 5 };
    
        Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2));
    }
    
    private static bool equals(IEnumerable arr1, IEnumerable arr2)
    {
    
        var enumerable1 = arr1.OfType<object>();
        var enumerable2 = arr2.OfType<object>();
    
        if (enumerable1.Count() != enumerable2.Count())
            return false;
    
        var iter1 = enumerable1.GetEnumerator();
        var iter2 = enumerable2.GetEnumerator();
    
        while (iter1.MoveNext() && iter2.MoveNext())
        {
            if (!iter1.Current.Equals(iter2.Current))
                return false;
        }
    
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      它是CollectionAssert.AreEqual,另见documentation for CollectionAssert

      【讨论】:

      • 请记住以下几点,stackoverflow.com/questions/5194966/… 对象可以明确地与 object.Equals 进行比较,并且可能必须定义 IEqualityComparer&lt;T&gt; 才能通过失败的断言。
      • 我希望它在失败时能提供更详细的消息。 “不同数量的元素”和“索引 0 处的元素不匹配”有点没用。 那它们是什么?!
      • CollectionAssert.AreEquivalent(可从 Visual Studio 2010 获得)提供了更多信息性结果。例如,当元素数量不同时,消息会说明预期和实​​际的元素数量
      【解决方案4】:

      在 .NET 3.5 中,或许可以考虑 Assert.IsTrue(foo.SequenceEqual(bar)); - 但它不会告诉您它在哪个索引处有所不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多