2009-09-04 5 views
0

테스트 할 수 있도록 IEnumerable을 반환하는 메서드가 있습니다. 내가 사용할 테스트 입력은 약 10 개의 값을 반환합니다.IEnumerable을 반환하는 메서드에 대한 테스트를 작성하는 방법

이 상황에서 가장 깨끗한 테스트 방법은 무엇입니까?

업데이트 : 지금까지 답변

많은 감사합니다. 지금 제가 조사 할 몇 가지 유용한 제안. 다음과 같이 내 원래의 질문이 매우 잘 표현 된 것을 생각하지 않는다

는 더 좋은 방법이 있었을 것이다 :

내가 KeyValuePair<string, uint>의는 IEnumerable을 반환하는 방법에 대한 몇 가지 테스트를 작성하고자합니다. 필자가 사용할 테스트 데이터 집합의 경우이 메서드는 몇 가지 값만 반환합니다. 대부분의 경우 ~ 10 값.

예상 반환 값 집합을 표현하고 MSTest에서 메서드를 테스트하는 가장 좋은 방법은 무엇입니까?

+0

는 반환 된 번호 또는 그들의 실제 값에 대한 걱정입니까? – CSharpAtl

+0

반환 된 실제 값을 테스트 할 수 있어야합니다. – dbush

+0

이것에 대한 모든 유용한 답변을 주셔서 감사합니다; 가장 유용한. – dbush

답변

3

어떤 결과가 반환되어야하는지 알고 있다고 가정하면 Enumerable.SequenceEqual이 유용합니다. (예상되는 결과를 가진 배열을 만듭니다.)

MoreLINQextension method에서 이것을 비교했습니다. extension method은 동등성을 테스트하고 두 시퀀스가 ​​같지 않을 경우 두 시퀀스를 덤프합니다. 사실, MoreLINQ 테스트는 대부분 시퀀스의 동일성을 테스트하는 데있어 유용 할 수 있습니다.

+0

매우 유용한 답변을 주셔서 감사합니다. – dbush

1
if(YourMethod(input).Count() != 10) // test failed 

Count 확장 방법은 IEnumerable을 통해 작동하고 그 후 당신의 모든 있다면, 당신은 시리즈의 항목 수를 결정할 수 있도록해야합니다. System.Linq을 포함시켜야합니다.

0

MSTest를 사용하는 경우, 제가 가정 할 때 CollectionAssert 클래스를 확인하십시오.

그러나 적절한 단위 테스트를 작성하려면 "약 10 개의 값"보다 구체적이어야합니다.

+0

물론입니다. 내가 얻은 것은 테스트를 실행할 입력 데이터 집합에 대해 수백만 개의 값과 반대되는 소수의 값만 반환한다는 것입니다. – dbush

+0

아, 그 정도면 충분합니다. :) – Noldorin

0

잘 모르시겠습니까?

나를 위해 테스트는 예상치 못한 상황을 테스트해야합니다. 그들은 경계와 전형적인 상황을 시험해야한다.

귀하의 경우, null, 비어 있음, 한 항목 및 두 가지 항목 (예 : 일반적인 10 가지 항목)을 테스트 할 것입니다. IEnumerable을 생성하는 코드를 알 수 있으므로 다른 경계를 결정할 수 있어야합니다.

+0

원래 질문을 업데이트했습니다. – dbush

1

CollectionAsserts에서 IEnumerables에 대한 어설 션이 부족하다는 것을 알았습니다.

은 그래서 저는 만든 다음

internal static class EnumerableAsserts 
{ 
    public static void AreEqual<T>(
     IEnumerable<T> expected, 
     IEnumerable<T> actual) 
    { 
    AreEqual(expected, actual, null); 
    } 

    public static void AreEqual<T>(
    IEnumerable<T> expected, 
    IEnumerable<T> actual, 
    string text) 
    { 
    text = text == null ? "" : text +" : "; 
    if (expected == null) 
     Assert.Fail("{0}expected is null!", text); 
    if (actual == null) 
     Assert.Fail("{0}actual is null!", text); 
    if (ReferenceEquals(expected, actual)) 
     return; 
    var e = expected.GetEnumerator(); 
    var a = actual.GetEnumerator(); 
    int count = 0; 
    while (e.MoveNext()) 
    { 
     count++; 
     if (a.MoveNext()) 
     { 
     if (!EqualityComparer<T>.Default.Equals(e.Current, a.Current)) 
      Assert.Fail(
      "{0}the {1}{2} item did not match expected '{3}' but was '{4}'", 
      text, count, MathUtils.GetOrdinal(count), e.Current, a.Current); 
     } 
     else 
     { 
     Assert.Fail(
      "{0}there were {1} expected entries but {2} actual entries", 
      text, expected.Count(), actual.Count()); 
     } 
    } 
    if (a.MoveNext()) 
     Assert.Fail(
     "{0}there were {1} expected entries but {2} actual entries", 
     text, expected.Count(), actual.Count()); 
    } 
} 
관련 문제