我已经编写了一个位于WPF应用程序的UI和异步消息传递系统之间的C#类。我现在正在为这门课写单元测试,并遇到调度员遇到的问题。以下方法属于我正在测试的类,它创建一个订阅处理程序。所以我从单元测试 - 测试方法调用这个Set_Listing_Records_ResponseHandler
方法。单元测试多线程WPF应用程序中使用的类
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。
任何援助将不胜感激。
谢谢你的时间。
看看这里提供的答案,让我知道是否需要更多的解释http://stackoverflow.com/a/38994745/5233410 – Nkosi
如果你想让你的课是单元测试,你应该遵循定期与所谓的依赖注入(DI)有关的良好实践。在这种情况下,您不应该使用WPF特定的类(Dispatcher),_especially_通过WPF特定的_static_类应用程序。相反,将Dispatcher视为依赖项并将其注入到您的类中,而不是Dispatcher本身,而是一些提供您所需方法的接口。你应该创建和实现你自己的接口,并在其中包装WPF分派器。然后在单元测试中,您只需提供另一个此IDispatcher的非WPF实现。 – Evk