编程语言
首页 > 编程语言> > c# – Rhino模拟执行收益率回报

c# – Rhino模拟执行收益率回报

作者:互联网

我正在尝试编写单元测试来检查解析错误.我正在从一个文件中传输数据,解析它并返回带有yield return的解析结果,然后将其传递给数据层以进行批量插入.

我在模拟调用数据层时遇到了麻烦.因为它被嘲笑它从来没有实际枚举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);
    }
}

解决方法:

一个最佳解决方案是将“// do magic”中发生的内容放在一个单独的方法中,这样它就可以单独进行单元测试 – 无需从处理StreamReader的while循环内部调用.

您看到的问题是由于对枚​​举的惰性评估.由于您的测试代码都没有实际枚举“事物”,因此永远不会处理“幕后”构建以处理迭代器块的状态机.

您需要枚举项目才能在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>得到它的数量.这将迫使对可枚举的评估.

标签:c,ienumerable,rhino-mocks,yield-return
来源: https://codeday.me/bug/20190630/1335178.html