2011-08-10 6 views
1

약간의 .net 2.0 프로젝트를 개발 중입니다. IEnumerator를 사용하는 클래스의 메서드를 테스트해야하는 시점에 이릅니다. 나는 코뿔소 모의 객체를 사용하는 것을 배웠다 며칠 전 나는이 내가 실행하려고하면 그것을 사용하기 때문에, 그것은 멈추지 않을 것Rhino Mocks : IEnumerator 스터 빙 <T>

public void Load(IEnumerator<string> pProcessCommmandNames) 
{ 
    while (pProcessCommmandNames.MoveNext()) 
    { 
     string bCommandName= pProcessCommmandNames.Current; 

     ... doing something with the string... 
    } 
} 

방법 코드를입니다

[Test] 
public void GetEnumerator_ValidList_ReverseIteration() 
{ 
    MockRepository mMocks = new MockRepository(); 
    IEnumerator<string> mStubEnumerator = mMocks.Stub<IEnumerator<string>>(); 
    IProcessCommandFactory mStubFactory = mMocks.Stub<IProcessCommandFactory>(); 

    using (mMocks.Record()) 
    { 

     mStubEnumerator.MoveNext(); 
     LastCall.Return(true); 

     Expect.Call(mStubEnumerator.Current); 
     LastCall.Return("Organization"); 

     mStubEnumerator.MoveNext(); 
     LastCall.Return(true); 

     Expect.Call(mStubEnumerator.Current); 
     LastCall.Return("Algorithm"); 

     mStubEnumerator.MoveNext(); 
     LastCall.Return(true); 

     Expect.Call(mStubEnumerator.Current); 
     LastCall.Return("ProcessTemplate"); 

     mStubEnumerator.MoveNext(); 
     LastCall.Return(false); 

    } 

    DeleteStrategy mStrategy= new DeleteStrategy( mStubFactory, 
                 "S1", 
                 true); 
    mStrategy.Load(mStubEnumerator); 

    ... meaningless code... 

} 

다음 테스트를 썼다 첫 번째 MoveNext()가 값을 주입하고 루프를 시작합니다.

내가 잘못하고있는 것을 누군가가 알아낼 수 있다면 감사하겠습니다.

덕분에 난 당신이 스텁 mStubEnumeratorLoad() 전달하는보고있는 무슨에서

+0

테스트 할 대상은 무엇입니까? MoveNext 메서드가 호출됩니다. "... meangingless code ..."는이 메소드의 중요한 부분이며 단위 테스트를 작성하려는 것입니다. – PatrickSteele

+0

미안하지만, 나는 서둘러 있었고, 당신이 말했듯이, 나는 중요한 선을 그었다. 그러나 거의 동일합니다. 내 메서드는 열거 자에서 문자열을 가져 와서 클래스를 인스턴스화하는 데 사용하지만 IEnumerator에 대해 원하는 반복 동작을 스텁 할 수없는 것 같습니다 – Watt

답변

0

. 스텁의 모든 속성을 설정하지 않으면 모든 메서드가 아무 것도 처리하지 않고 모든 속성이 null을 반환합니다.

Here은 Mock, Stubs 및 Fakes의 차이점을 검토 한 Martin Fowler의 멋진 기사입니다.

그래서이 테스트 작업을 만들기 위해, 나는 가짜를 사용하는 것이 좋습니다 것입니다 :
MockRepository mMocks = new MockRepository(); 
IEnumerator<string> mFakeEnumerator = new List<string>(); 
mFakeEnumerator.Add("Organization"); 
mFakeEnumerator.Add("Algorithm"); 
mFakeEnumerator.Add("ProcessTemplate"); 
IProcessCommandFactory mStubFactory = mMocks.Stub<IProcessCommandFactory>(); 
... 

는 지금은 테스트를 통과 할 것으로 추측하고있다, 또는 통과 가까이 될 것입니다.

그러나 코드를 더 이상 보지 않고도 달성하려는 목표를 효과적으로 테스트 할 수 있는지 확신 할 수 없습니다.

+0

감사합니다. – Watt

0

그냥 IEnumerator<String>이 필요하면 모의를 만들 필요가 없습니다. 간단히 List<String>을 만들고 열거자를 전달하십시오.

var commandNames = new List<String> {"one", "two", "three"}; 
DoSomething(commandNames.GetEnumerator()); 
관련 문제