xUnit : 두 개의 List <T>가 동일하다고 주장합니까?


109

저는 TDD와 xUnit을 처음 사용하므로 다음과 같은 방법을 테스트하고 싶습니다.

List<T> DeleteElements<T>(this List<T> a, List<T> b);

사용할 수있는 Assert 메서드가 있습니까? 이런 게 좋을 것 같아요

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

이와 같은 것이 있습니까?

답변:


136

xUnit.Net 은 컬렉션을 인식하므로 수행하면됩니다.

Assert.Equal(expected, actual); // Order is important

CollectionAsserts.cs 에서 사용 가능한 다른 컬렉션 어설 션을 볼 수 있습니다.

들어 NUnit과 라이브러리 모음 비교 방법은

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

자세한 내용은 여기 : CollectionAssert

MbUnit 에는 NUnit : Assert.Collections.cs 와 유사한 컬렉션 어설 션도 있습니다.



1
댓글의 새 링크도 끊어졌습니다.
Scott Stafford

1
이제 프로젝트가 GitHub로 이동되었지만 거기에서도 특정 소스 파일을 찾을 수 없었습니다.
MEMark

1
복잡한 개체의 경우 Equal + GetHasCode가 필요하다는 것을 잊지 마십시오. Equal 메서드에 사용자 지정 EqulityComparer를 제공하십시오
maracuja-juice

2
xUnit Equal 메서드는 콘텐츠가 동일한 두 개의 IEnumerable에 대해 false를 반환합니다.
Vladimir Kocjancic

31

현재 버전의 XUnit (1.5)에서는 다음을 사용할 수 있습니다.

Assert.Equal (예상, 실제);

위의 방법은 두 목록의 요소 별 비교를 수행합니다. 이것이 이전 버전에서 작동하는지 확실하지 않습니다.


7
Assert.Equal for collections에서 발생한 문제는 요소가 둘 다에 있더라도 컬렉션의 요소가 다른 순서로 있으면 실패한다는 것입니다.
Scott Lawrence

1
@ ScottA.Lawrence 목록에도 순서가 있습니다! HashSets에서 동일한 동작을 얻습니까?
johv

@johv HashSets로 테스트하지 않았지만 좋은 생각입니다. 시도해 볼 기회가 생기면 여기에서 대답하는 것을 기억하려고 노력할 것입니다.
Scott Lawrence

2
컬렉션 유형이 다르면 둘 다 동일한 순서로 동일한 항목이 포함되어 있어도 실패하는 것 같습니다.
James White

3
그러나 그것은 매우 형편없는 결과물을 가지고 있습니다. 두 목록이 다른 곳을 알려주지 않습니다! :(
Zordid

16

xUnit을 사용하여 테스트 할 각 요소의 속성을 선택하려면 Assert.Collection을 사용할 수 있습니다.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

이는 예상 개수를 테스트하고 각 작업이 확인되었는지 확인합니다.


2

최근에 asp.net 코어 2.2 앱에서 xUnit 2.4.0Moq 4.10.1패키지를 사용 하고 있었습니다 .

제 경우에는 두 단계 프로세스로 작동하도록 관리했습니다.

  1. 구현 정의 IEqualityComparer<T>

  2. 비교 자 인스턴스를 세 번째 매개 변수로 Assert.True메서드에 전달합니다.

    Assert.True(expected, actual, new MyEqualityComparer());

그러나 FluentAssertions 패키지를 사용하여 동일한 결과를 얻는 또 다른 좋은 방법이 있습니다 . 다음을 수행 할 수 있습니다.

// Assert          
expected.Should().BeEquivalentTo(actual));

흥미롭게 Assert.Equal()도 두 목록의 요소를 동일한 순서로 가져 오도록 주문하더라도 항상 실패합니다.


2
주문에 문제가 있습니다. BeEquivalentTo는 주문에 대해 신경 쓰지 않습니다 (이것이 테스트가 assert.Equal이 아닌 BeEquivalentTo로 통과하는 이유입니다)
RagnaRock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.