Visual Studio 2008 테스트 프레임 워크에서 배열이 동일한 지 확인


81

두 배열이 동일한 지 (즉, 동일한 수의 요소가 있고 각 요소가 동일한 지) 단위 테스트에서 쉽게 확인할 수있는 방법이 있습니까?

Java에서는를 사용 assertArrayEquals (foo, bar);하지만 C #에 해당하는 것은없는 것 같습니다. 시도 Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));했지만 함수가 "a", "b"가있는 배열을 반환하더라도 검사는 여전히 실패합니다.

이것은 기본 제공 단위 테스트 프레임 워크와 함께 Visual Studio 2008 Team Suite를 사용합니다.

답변:


147

그것은 CollectionAssert에CollectionAssert.AreEqual 대한 문서 도 참조하십시오 .


그냥 다음 사항을 염두에 두어야합니다 stackoverflow.com/questions/5194966/... 와 객체가 명시 적으로 비교 될 수있다 object.Equals과는 IEqualityComparer<T>실패한 주장을 전달받을하기 위해 정의해야 할 수 있습니다.
atconway

2
이것이 실패했을 때 더 자세한 메시지를 주었으면합니다. "다른 수의 요소"및 "색인 0의 요소가 일치하지 않음"은 약간 쓸모가 없습니다. 그렇다면 그들은 무엇입니까?!
대령 패닉

2
CollectionAssert.AreEquivalent(Visual Studio 2010에서 사용 가능) 더 많은 정보를 제공합니다. 예를 들어, 요소 수가 다른 경우 예상되는 요소 수와 실제 요소 수를 메시지에 표시합니다
Dennie

21

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.)

젠장, 우연히이 답변에 반대표를 던졌고 이제 내 반대표를 취소 할 수 없습니다. "이 답변을 편집하지 않으면 투표가 잠겨 있습니다."라는 메시지가 표시됩니다. :(
Roman Pekar

이 답변은 전년도의 답변보다 나아 보이지 않습니다.
Konstantin

3

.NET 3.5에서는 고려할 Assert.IsTrue(foo.SequenceEqual(bar));수 있습니다.하지만 어떤 인덱스가 다른지 알려주지는 않습니다.


1

Ok 여기에 약간 더 긴 방법이 있습니다 ...

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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.