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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?相关的知识,希望对你有一定的参考价值。

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

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

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

我可以为TaskTaskFactory创建接口和代理,然后在那个级别设置期望,但我希望有更少的参与。

答案

你能改变wr的类型来暴露一个返回GetRequestAsyncTask<Stream>方法吗?这样你就可以嘲笑它,以便它从TaskCompletionSource中返回一个你可以在测试中产生的任务。我自己做了类似的事情来测试一个组合块,它运行良好。根据可能发生的所有不同事情,编写测试很有意思,但它的工作原理......

另一答案

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

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

不要忘记把正确的EventArgs实例。

以上是关于我可以使用哪些技术来模拟与TaskFactory.FromAsync()的交互?的主要内容,如果未能解决你的问题,请参考以下文章

c# TaskFactory ContinueWhenAll 在所有任务完成之前意外运行

taskFactory

matlab可以与哪些软件联合仿真

我应该使用哪些技术在浏览器中进行 2d 自上而下的足球模拟?

如何从服务器端模拟复杂的 REST 调用?

《CLR via C#》之线程处理——线程池与任务