2012-02-08 75 views
4

我想寫一個單元測試來檢查解析錯誤。我從一個文件流入數據,解析它並返回帶有返回值的解析結果,然後將它傳遞給數據層以批量插入。犀牛模擬執行收益回報

我無法嘲笑對數據層的調用。因爲它被嘲笑,它實際上從來沒有枚舉yield return的值,因此我的解析方法從不執行。

public class Processor 
{ 
    public IUnityContainer Container { get; set; } 

    public void ProcessFile(Stream stream) 
    { 
     var datamanager = Container.Resolve<IDataManager>();            
     var things = Parse(stream);   
     datamanager.Save(things);         
    } 

    IEnumerable<string> Parse(Stream stream) 
    { 
     var sr = new StreamReader(stream); 
     while (!sr.EndOfStream) 
     { 
      string line = sr.ReadLine(); 
      // do magic 
      yield return line; 
     } 
    } 
} 

我試過類似這樣的東西,顯然不起作用。

[TestMethod]   
[ExpectedException(typeof(ApplicationException))] 
public void ProcessFile_InvalidInput_ThrowsException() 
{ 
    var mock = new MockRepository(); 

    var stream = new MemoryStream(); 
    var streamWriter = new StreamWriter(stream);     
    streamWriter.WriteLine("\\:fail"); 
    streamWriter.Flush(); 
    stream.Position = 0; 

    var datamanager = mock.Stub<IDataManager>();       
    TestContainer.RegisterInstance(datamanager); 

    var repos = new ProcessingRepository(); 
    TestContainer.BuildUp(repos); 

    using (mock.Record()) 
    {       
     Expect.Call(file.InputStream).Return(stream);        
     Expect.Call(delegate() { repos.Save(new List<string>()) }).IgnoreArguments(); 
    } 
    using (mock.Playback()) 
    { 
     repos.ProcessFile(stream); 
    } 
} 

回答

3

一個最佳的解決方案將是把在一個單獨的方法,因此它可以在單元測試的隔離發生在「//做神奇」的東西 - 而無需從while循環中被調用即處理StreamReader。

您看到的問題是由於枚舉的惰性評估。由於沒有任何測試代碼實際上正在枚舉這些「事物」,所以「幕後」構建的用於處理迭代器塊的狀態機永遠不會被處理。

爲了實際執行Parse方法中的邏輯,您需要使項目被枚舉。爲此,您可以使用我的Rhino.Mocks「WhenCalled」的方法(我顯示AAA語法,因爲我不記得如何使用記錄/重放語義):

注意:這是未經測試的代碼

datamanager.Stub(d => d.Save(null)).IgnoreArguments().WhenCalled(m => int count = ((IEnumerable<string>)m.Arguments[0]).Count()); 

會發生什麼情況是,當您的存根上的Save方法被調用時,「WhenCalled」將傳遞一個參數(m),其中包含有關所調用方法的信息。抓住第一個參數(東西),將其轉換爲IEnumerable<string>並獲得它的數量。這將強制對枚舉進行評估。

+0

WhenCalled正是我所期待的。謝謝! – bmancini 2012-02-09 22:39:39