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

本文关键字:FromAsync 交互 TaskFactory 可以使 什么 技术 模拟 我可以 | 更新日期: 2023-09-27 18:14:59

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

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

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

我可以为TaskTaskFactory创建接口和代理,然后在该级别设置期望,但我希望有一些较少涉及的东西。

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

您可以更改wr的类型以暴露返回Task<Stream>GetRequestAsync方法吗?这样,您就可以模拟它,以便它从TaskCompletionSource返回一个任务,您可以在测试中执行该任务。我自己也用一个类做过类似的事情来测试组合块,效果很好。就可能发生的所有不同的事情而言,编写测试是有趣的,但是它可以工作…

我不确定我的问题是正确的,如果你想模拟事件引发你可以使用以下语法:

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

不要忘记把EventArgs instance放在右边