我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?相关的知识,希望对你有一定的参考价值。
我试图单元测试我的应用程序和异步HttpWebRequest
方法的交互,我想知道如何模拟异步回调的调用。例如,请考虑以下代码:
Task.Factory
.FromAsync<Stream>(wr.BeginGetRequestStream, wr.EndGetRequestStream, null)
.ContinueWith(SomeDelegate);
在这种情况下,wr
是一个基本上包装HttpWebRequest的对象。我可以在单元测试中存根并设置对该对象的期望,但我想不出一种方法来创建否则会调用EndRequestStream
的信号。如果没有此信号,单元测试将无限期地等待任务完成,这将永远不会发生。
我可以为Task
和TaskFactory
创建接口和代理,然后在那个级别设置期望,但我希望有更少的参与。
答案
你能改变wr
的类型来暴露一个返回GetRequestAsync
的Task<Stream>
方法吗?这样你就可以嘲笑它,以便它从TaskCompletionSource
中返回一个你可以在测试中产生的任务。我自己做了类似的事情来测试一个组合块,它运行良好。根据可能发生的所有不同事情,编写测试很有意思,但它的工作原理......
另一答案
我不确定我是否正确,如果你想模拟事件提升你可以使用以下语法:
// wr should be Mock
// EndRequestStream - event
wr.Raise(x => x.EndRequestStream += null,
this,
new EventArgs(...));
不要忘记把正确的EventArgs
实例。
以上是关于我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?的主要内容,如果未能解决你的问题,请参考以下文章
c# TaskFactory ContinueWhenAll 在所有任务完成之前意外运行