2012-02-08 77 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