2011-08-10 51 views
1

我正在開發一個.net 2.0項目。我到了需要測試一些需要IEnumerator的類的方法。由於前幾天我學會了用犀牛嘲笑我寫了下面的測試犀牛嘲笑:扼殺一個IEnumerator <T>

[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... 

} 

這是方法的代碼

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

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

當我嘗試運行,它不會停止,因爲它使用只有第一個MoveNext()注入值並開始一個循環。

我會很感激,如果有人可以把我搞錯我做錯了什麼?

感謝

+0

它是什麼你想測試?只需調用MoveNext方法?看起來像「...無代碼的代碼......」是這種方法的重要組成部分,這就是你想要編寫單元測試的。 – PatrickSteele

+0

對不起,我很匆忙,正如你所說,我採取了一條重要的路線。但它幾乎相同。我的方法需要一個來自枚舉器的字符串,並用它來實例化一個類,但似乎我不能存儲IEnumerator的迭代行爲 – Watt

回答

0

從我所看到的你逝去的Load()存根mStubEnumerator。無需設置存根控件上的任何屬性,所有方法都不會執行任何操作,並且所有屬性都將返回null。

Here是Martin Fowler回顧Mock,Stubs和Fakes之間差異的一篇很棒的文章。

因此,爲了使這個測試工作,我會考慮使用假:

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());