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
,它是在网络设备驱动程序异步通知您相应的“开始”调用完成后调用的。这似乎是我控制接口的最佳方法。您建议的方法也可以很好地替代接口上已有的异步方法。