2010-01-21 4 views
0

제네릭 기본 유형의 메서드를 호출하면 내 단위 테스트에서 매우 이상한 일을합니다. 나는 NUnit과 MSTest를 같은 결과로 시도했다. 다음은 코드가 구성되는 방식입니다.IEnumerable 및 yield yield

public class MyStub {} 

public class EnumerableGenerator 
{ 
    public bool GotMyStubs; 

    public IEnumerable<MyStub> GetMyStubs() 
    { 
     GotMyStubs = true; 
     yield return new MyStub(); 
    } 
} 
public class ConsoleRunner 
{ 
public void Main(string args[]) 
{ 
    EnumerableGenerator gen = new EnumerableGenerator(); 
    gen.GotMyStubs = false; 
    var myStubs = gen.GetMyStubs(); 
    if (!gen.GotMyStubs) 
     return 1; 
} 
} 

테스트가 명백하게 실패합니다. 이상한 부분은 코드를 통합 테스트 할 때 코드가 잘 작동한다는 것입니다. 그것은 단원 테스트에서 휴식. GetMyStubs에 전혀 참여할 수 없습니다. 메서드 내의 중단 점도 중단되지 않습니다. 나는 CLR에 의해 던져지는 모든 예외에 대한 위반을 켰다. 그리고 이것은 아무것도 얻지 않는다.

내가 GetMyStubs에 의해 반환 유형을 검사하고 유형의 전체 이름은 다음과 같습니다

[MyNamespace.EnumerableGenerator2 + <GetMyStubs> d__8 [[MyNamespace.MyStub, MyNamespace에, 버전 = 7.1.0.0, 문화 = 중립, PublicKeyToken = null]]

이제 (MSTest를 통해) 코드 커버리지 번호를 살펴보면 EnumerableGenerator.d__8 항목이 있음을 알 수 있습니다.

이런 사람이 있습니까? 나는 완전히 잃어 버렸어 ....

+0

실제 문제를 설명하기 위해 코드 예제를 단순화하고 더 가깝게 일치하도록 이름을 변경했습니다. –

+0

맞습니다. 왜 그것이 실패하고 있는지 확실히 설명합니다. –

+0

나는 이것을 아주 자주 얻는다. 여기에 내 기사가 있습니다 : http://blogs.msdn.com/ericlippert/archive/2007/09/05/psychic-debugging-part-one.aspx 및 HTTP : //blogs.msdn .com/ericlippert/archive/2007/09/06/psychic-debugging-part-two.aspx –

답변

3

코드는 컴파일되지 않습니다. IEnumerable<T>Count 속성이 없습니다. Count()확장 방법 - 그게 무슨 뜻입니까?

나는 MyMethod()이 아니며 이 실제로는 인 것으로 의심됩니다. 나는 그것이 실제적으로 yield return을 사용하여 아이템을 반환한다고 생각합니다 ... 어느 시점에서 타입의 전체 이름은 이해할 수 있습니다. iterator 블록에 의해 생성 된 상태 머신입니다.

이 경우를 가정하면 MyMethod()으로 전화하면 코드가 실행되지 않습니다. 상태 기계를 작성하여 리턴합니다. 그것을 반복 할 때 다음에이 실행되면 코드가 실행되기 시작합니다. 중단 점이 발생할 것으로 예상되는 시점입니다.

간단하지만 완전한 예제 (필요한 경우 NUnit 사용하지만 콘솔 앱이 이상적 일 수 있습니다)를 제공 할 수 있습니까?

+0

당신은 확장 방법에 대해 옳았습니다. 그것이 내가 의미했던 것입니다. 그리고 다시 당신은 항복 수익에 대해 옳았습니다. 나는 확실히 그것에 대해 뭔가를 배웠습니다. 위의 예제를 코드를보다 명확하게 보여주기 위해 업데이트하겠습니다. –

관련 문제