2013-08-15 4 views
-1

나는 xUnit의와 MOQ를 사용하고 있는데이 테스트를 위해 노력하고 있어요 :단위 테스트 조치 <T>?

public static class IEnumerableExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> list, Action<T> action) 
    { 
     foreach (var item in list) 
      action(item); 
    } 
} 

내가 이것을 시도했다, 그러나 거래 :

[Fact] 
    public void ForEach() 
    { 
     var list = new List<string>() { "string1", "string2" }; 

     list.ForEach(x => 
     { 
      x += "-passed"; 
     }); 

     foreach (var item in list) 
      item.Should().EndWith("-passed"); 
    } 

방법이 테스트에 대한 갈 것이라고?

+2

참고 : 또한이 호출 된 횟수의 카운트를 유지 할 수 있습니다

var list = new List<string>() { "string1", "string2" }; var dest = new List<string>(); list.ForEach(s => { dest.Add(x + "-passed"); }); foreach (var item in dest) { item.Should().EndWith("-passed"); } 

: 나는 새 목록을 만들 것 목록 또는 목록의 항목 중 하나를 선택하십시오. 루프 변수 만 변경하고 있습니다. 이 경우 메서드는 정확히 수행해야하는 작업이며, 부적절하게 사용하는 것입니다. – Servy

답변

1

현재 테스트에서는 작업에서 로컬 x 변수 만 수정하고 있습니다. 당신의 예제 테스트 당신이 어느 것도 돌연변이를 걸

int called = 0; 
list.ForEach(s => { 
    dest.Add(x + "-passed"); 
    called++; 
}); 

Assert.AreEqual(called, list.Count); 
+0

이것이 목표라면 '선택'만 사용해야합니다. 여기서 목표는 'ForEach'를 테스트하는 것이지만, 그 날이 끝날 때까지는 그 방법이 달성하도록 고안된 문제는 아닙니다. 테스트는 실제로 처음부터 바뀌어야합니다. – Servy

+0

@Servy - 빠른 샘플을 추가 할 수 있을까요? – Sam

+1

@Servy - 물론 ForEach를 사용하여 정상적으로 투영 할 수는 없지만 실제로 테스트 할 수있는 유일한 방법은 제공된 입력 된 동작이 각 입력 요소에서 호출된다는 것입니다. 따라서 나중에 주장 할 수있는 효과가 있어야합니다. – Lee

1
List<int> items = new List<int>(); 
Action<int> act = i => { items.Add(i); }; 

Enumerable.Range(0, 10).ForEach(act).ToList(); 

Assert.That(items.Count, Is.EqualTo(10)); 
... 
+0

이것에 대해 자세히 설명해주십시오 :'Action act = i => {items.Add (i); };'? '나'는 무엇을 의미합니까? '=>'는 무엇을 하는가? – Sam

+1

그 행은'For()'메소드로 전달되는'Action '객체를 생성합니다. '=>'는'Action '유형의 익명의 위임을 생성하는 방법입니다. 'i'는 목록을 열거하는 동안 항목 값입니다. 이 경우'Enumerable '이므로'int'입니다.Range (0,10)'는'IEnumerable '을 반환합니다. –