【发布时间】:2016-11-26 11:50:12
【问题描述】:
我编写了一个 C# 类,它位于 WPF 应用程序的 UI 和异步消息传递系统之间。我现在正在为这个类编写单元测试,并遇到了调度程序的问题。以下方法属于我正在测试的类,它创建了一个订阅处理程序。所以我从单元测试 - 测试方法中调用这个Set_Listing_Records_ResponseHandler 方法。
public async Task<bool> Set_Listing_Records_ResponseHandler(
string responseChannelSuffix,
Action<List<AIDataSetListItem>> successHandler,
Action<Exception> errorHandler)
{
// Subscribe to Query Response Channel and Wire up Handler for Query Response
await this.ConnectAsync();
return await this.SubscribeTo_QueryResponseChannelAsync(responseChannelSuffix, new FayeMessageHandler(delegate (FayeClient client, FayeMessage message) {
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
try
{
...
}
catch (Exception e)
{
...
}
}));
}));
}
执行流程回到 Application.Current.Dispatcher.... 行但随后抛出错误:
Object reference not set to an instance of an object.
当我调试时,我可以看到 Application.Current 为空。
我进行了一些搜索,发现了一些在单元测试 - 测试方法中使用调度程序的示例,我已经尝试了其中的一些,它们可以防止错误,但是调度程序中的代码永远不会运行。
我找不到任何在测试方法调用的方法中使用了 Dispatcher 的示例。
我在 Windows 10 机器上使用 .NET 4.5.2。
任何帮助将不胜感激。
感谢您的宝贵时间。
【问题讨论】:
-
看看这里提供的答案,如果需要更多解释,请告诉我stackoverflow.com/a/38994745/5233410
-
如果你希望你的类是可单元测试的,你应该遵循与依赖注入(DI)相关的常规良好实践。在这种情况下,您不应该使用 WPF 特定的类 (Dispatcher),尤其是 通过 WPF 特定的 static 类应用程序。相反,将 Dispatcher 视为依赖项并将其注入到您的类中,而不是 Dispatcher 本身,而是一些提供您需要的方法的接口。您应该自己创建和实现这样的接口,并将 WPF Dispatcher 包装在其中。然后在单元测试中,您只需提供此 IDispatcher 的另一个非 WPF 实现。
标签: c# wpf multithreading unit-testing .net-4.5.2