我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?

时间:2011-11-16 23:01:17

标签: c# mocking task-parallel-library rhino-mocks

我正在尝试对我的应用程序和异步HttpWebRequest方法的交互进行单元测试,并且想知道如何模拟异步回调的调用。例如,请考虑以下代码:

Task.Factory
    .FromAsync<Stream>(wr.BeginGetRequestStream, wr.EndGetRequestStream, null)
    .ContinueWith(SomeDelegate);

在这种情况下,wr是一个基本上包装HttpWebRequest的对象。我可以在单元测试中存根并设置对该对象的期望,但我想不出一种创建信号的方法,否则会调用EndRequestStream。没有这个信号,单元测试会无限期地等待任务完成,这将永远不会发生。

我可以为TaskTaskFactory创建接口和代理,然后在该级别设置期望值,但我希望不会涉及更少的内容。

2 个答案:

答案 0 :(得分:2)

您是否可以更改wr的类型以公开返回GetRequestAsync的{​​{1}}方法?这样你就可以模拟它,以便从Task<Stream>返回一个你可以在你的测试中产生的任务。我自己做了类似的事情来测试一个组合块,它运行良好。根据可能发生的所有不同事情,编写测试很有意思,但它有效......

答案 1 :(得分:0)

我不确定我是否正确,如果你想模拟事件提升你可以使用以下语法:

// wr should be Mock
// EndRequestStream  - event
wr.Raise(x => x.EndRequestStream += null, 
              this, 
              new EventArgs(...));

不要忘记放右EventArgs个实例。