C# 我可以使用哪些技术模拟与TaskFactory.FromAsync()的交互?
我试图对我的应用程序和异步C# 我可以使用哪些技术模拟与TaskFactory.FromAsync()的交互?,c#,mocking,task-parallel-library,rhino-mocks,C#,Mocking,Task Parallel Library,Rhino Mocks,我试图对我的应用程序和异步HttpWebRequest方法的交互进行单元测试,我想知道如何模拟异步回调的调用。例如,考虑下面的代码: Task.Factory .FromAsync<Stream>(wr.BeginGetRequestStream, wr.EndGetRequestStream, null) .ContinueWith(SomeDelegate); Task.Factory .FromAsync(wr.BeginGetRequestStream,wr
HttpWebRequest
方法的交互进行单元测试,我想知道如何模拟异步回调的调用。例如,考虑下面的代码:
Task.Factory
.FromAsync<Stream>(wr.BeginGetRequestStream, wr.EndGetRequestStream, null)
.ContinueWith(SomeDelegate);
Task.Factory
.FromAsync(wr.BeginGetRequestStream,wr.EndGetRequestStream,null)
.继续与(某位代表)会面;
在本例中,wr
是一个实质上包装了HttpWebRequest的对象。我可以在单元测试中存根并设置对这个对象的期望,但是我想不出一种方法来创建信号,否则就会调用EndRequestStream
。如果没有这个信号,单元测试块将无限期地等待任务完成,这是永远不会发生的
我可以为
Task
和TaskFactory
创建接口和代理,然后在该级别设置期望值,但我希望少涉及一些内容。能否更改wr
的类型以公开返回任务的GetRequestAsync
方法?这样,您可以模拟它,以便它从TaskCompletionSource
返回一个任务,您可以在测试中生成该任务。我自己也做过类似的实验来测试一个合成块,效果很好。根据可能发生的所有不同情况编写测试很有趣,但它是有效的…我不确定我是否正确理解了queston,如果要模拟事件引发,可以使用以下语法:
//wr应该是Mock
//EndRequestStream-事件
wr.Raise(x=>x.EndRequestStream+=null,
这
新事件参数(…);
不要忘了将EventArgs
实例放到右边。在我的示例中,EndGetRequestStream
是一种方法。它相当于HttpWebRequest.EndGetRequestStream
,它是在网络设备驱动程序异步通知您相应的“开始”调用完成后调用的。这似乎是我控制接口的最佳方法。您建议的方法也可以很好地替代接口上已有的异步方法。