2013-09-25 1 views
3

나는 IEnumerable<T> 컬렉션을 가지고 있으며 First<T>() 메서드 호출을 조롱하고 싶습니다. 내가이 작업을 시도하면 다음과 같이 나타납니다.어떻게 Rhino mock을 사용하여 IEnumerable.First <T>() 메소드를 조롱 했습니까?

이전 메서드 인 'IEnumerator.MoveNext();' 던질 때 반환 값 또는 예외가 필요합니다.

나는 아래의 코드를 붙여 오전 :

IEnumerable<T> collection = MockRepository 
    .GenerateStub<IEnumerable<T>>(); 
collection 
    .Stub(x => x.First<T>()) 
    .IgnoreArguments() 
    .Return(MockRepository.GenerateStub<T>()); 

을하지만 x.First<T> 위의 예외가 발생합니다. 어떻게 해결합니까? GetEnumerator() 메서드 호출을 조롱하여 IEnumerator을 반환하려고했습니다. 그것은 어느 쪽도 도움이되지 않았다.

답변

5

코드가 일반 함수이기 때문에 T이 있다고 가정합니다.

정적 확장 방법이기 때문에 First<T>()으로 전화를 걸 수 없습니다. IEnumerable<T>에 정의되어 있지 않으며, Enumerable의 구성원입니다. 내가 강하게는 시도에 대해 추천 할 것입니다, 그러나

IEnumerator<T> enumerator = MockRepository.GenerateStub<IEnumerator<T>>(); 
enumerator.Stub(x => x.MoveNext()).Return(true); 
enumerator.Stub(x => x.Current).Return(MockRepository.GenerateStub<T>()); 
enumerator.Stub(x => x.MoveNext()).Return(false); 

IEnumerable<T> collection = MockRepository.GenerateStub<IEnumerable<T>>(); 
collection.Stub(x => x.GetEnumerator()).Return(enumerator); 

:

그래서, 당신은 당신이 원하는 유형의 스텁을 반환하는 IEnumerator<T> 스텁을 반환하기 위해 IEnumerable<T> 스텁에 GetEnumerator() 스텁해야합니다 모의 IEnumerable. - 인터페이스를 사용하는 모든으로,

List<T> listOfT = new List<T> 
{ 
    MockRepository.GenerateStub<T>() 
}; 

이 스텁 수있는 정말 좋은 생각/모의 수집 인터페이스 유형 : 그것은 단일 항목으로 List<>를 사용하면 처음에 코드를 훨씬 쉽고 나중에 읽고, 훨씬 덜 취성 의미는 있지만 실제 수집 물을 사용하여 테스트 한 것입니다.

+0

깔끔한 답변입니다. 아, 정적 함수를 모의 할 수 없다는 것을 알았습니다. 그러나 이것은 결코 나를 때리지 못했습니다. 글쎄, IEnumerable 인터페이스를 조롱하지 말라는 제안을 받기 바란다. 그러나, 내가 단위 테스트 케이스를 작성하는 코드가 쓰여지는 방식으로 제가 그렇게하도록 강요합니다. Chris에게 답해 주셔서 감사합니다. – Anee

관련 문제