단위 테스트에서 목록을 비교하는 방법


181

이 테스트는 어떻게 실패 할 수 있습니까?

[TestMethod]
public void Get_Code()
{
    var expected = new List<int>();
    expected.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    var actual = new List<int>();
    actual.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    Assert.AreEqual(expected, actual);
    // Assert.AreSame(expected, actual)       fails
    // Assert.IsTrue(expected.Equals(actual)) fails
}

답변:


371

컬렉션에 대한 어설 션을 만들려면 다음을 사용해야합니다 CollectionAssert.

CollectionAssert.AreEqual(expected, actual);

List<T>오버라이드 (override)하지 않는 Equals, 그렇다면 Assert.AreEqual바로 호출 Equals, 그것을 참조 평등을 사용하여 종료됩니다.


6
이것이 실패했을 때 더 자세한 메시지를 제공하기를 바랍니다. "다른 요소 수"와 "인덱스 0의 요소가 일치하지 않습니다"는 약간 쓸모가 없습니다. 그들은 무엇입니까?!
대령 패닉

32
항목 순서에 관심이없는 경우 : {A, B, C} == {C, B, A} CollectionAssert.AreEquivalent대신 msdn.microsoft.com/en-us/library/ms243779.aspx
user2023861

2
다음 CollectionAssert.AreEqual보다 눈에 띄게 느릴 수 있습니다.Assert.IsTrue...SequenceEqual
Mark Sowul

1
@MarkSowul :하지만 훨씬 더 나은 고장 진단 기능이 제공됩니다.
Jon Skeet

2
@MarkSowul : 흠 ... 버그로보고 할만한 가치가있는 것 같습니다. 그렇게 나쁜 이유는 없습니다.
Jon Skeet

34

나는 이것이 도움이 될 것 같아

Assert.IsTrue(expected.SequenceEqual(actual));

4
그것은 내 폴백이지만 CollectionAssert가 더 유용한 실패 메시지를 제공하기를 바랍니다.
Jon Skeet 2012 년

4
안타깝게도 "CollectionAssert.AreEqual이 실패했습니다. (인덱스 0의 요소가 일치하지 않습니다.)"(요소는 무엇입니까?)
이름 :

17

각각에 동일한 값 모음이 포함되어 있는지 확인하려면 다음을 사용해야합니다.

CollectionAssert.AreEquivalent(expected, actual);

편집하다:

"두 개의 컬렉션은 같은 양이지만 같은 순서로 같은 요소를 가지고 있다면 동등합니다. 같은 개체를 참조하는 것이 아니라 값이 같은 요소는 같습니다." -https : //msdn.microsoft.com/en-us/library/ms243779.aspx


14

이 스레드에서 다른 답변을 시도했지만 그들은 효과가 없었으며 속성에 동일한 값이 저장된 객체 컬렉션을 비교했지만 객체는 다릅니다.

메소드 호출 :

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);

비교 방법 :

private static void CompareIEnumerable<T>(IEnumerable<T> one, IEnumerable<T> two, Func<T, T, bool> comparisonFunction)
    {
        var oneArray = one as T[] ?? one.ToArray();
        var twoArray = two as T[] ?? two.ToArray();

        if (oneArray.Length != twoArray.Length)
        {
            Assert.Fail("Collections are not same length");
        }

        for (int i = 0; i < oneArray.Length; i++)
        {
            var isEqual = comparisonFunction(oneArray[i], twoArray[i]);
            Assert.IsTrue(isEqual);
        }
    }

3
좋은 추가, 또는 당신은 또한 Equals방법을 재정의하고 CollectionAssert작동합니다.
Ray Cheng

6

이 테스트는 날짜 입력을 비교하고 윤년이 있는지 확인한 경우 입력 날짜에서 20 윤년을 출력하고 그렇지 않은 경우 NEXT 20 윤년을 출력하고 myTest를 테스트합니다. 필요한 계산 된 값을 포함하는 Testing이라는 목록에서 내가해야 할 운동의 일부.

[TestMethod]
        public void TestMethod1()
        {
            int testVal = 2012;
            TestClass myTest = new TestClass();
            var expected = new List<int>();
            expected.Add(2012);
            expected.Add(2016);
            expected.Add(2020);
            expected.Add(2024);
            expected.Add(2028);
            expected.Add(2032);
            expected.Add(2036);
            expected.Add(2040);
            expected.Add(2044);
            expected.Add(2048);
            expected.Add(2052);
            expected.Add(2056);
            expected.Add(2060);
            expected.Add(2064);
            expected.Add(2068);
            expected.Add(2072);
            expected.Add(2076);
            expected.Add(2080);
            expected.Add(2084);
            expected.Add(2088);
            var actual = myTest.Testing(2012);
            CollectionAssert.AreEqual(expected, actual);
        }

0
List<AdminUser> adminDetailsExpected = new List<AdminUser>()
{
new AdminUser  {firstName = "test1" , lastName = "test1" , userId = 
"001test1"  },
new AdminUser {firstName = "test2" , lastName = "test2" , userId = 
"002test2"   }
};

//행위

List<AdminUser> adminDetailsActual = RetrieveAdmin(); // your retrieve logic goes here

// 어설 션

Assert.AreEqual(adminDetailsExpected.Count, adminDetailsActual.Count);  //Test succeeds if the count matches else fails. This count can be used as a work around to test

0

유창한 어설 션은 배열을 깊이 비교합니다. actualArray.Should().BeEquivalentTo(expectedArray)

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