【问题标题】:How to set up ServiceLocationProvider for unit testing navigation in Prism?如何为 Prism 中的单元测试导航设置 ServiceLocationProvider?
【发布时间】:2015-08-05 17:12:01
【问题描述】:

我正在开发的一个 Prism/Unity 应用程序有一个视图,它负责实现 RegionNavigationJournalGoBack()GoForward() 方法。这将是我第一次需要对任何使用 RegionManager 的东西进行单元测试,并且我遇到了一个错误,提示

必须设置ServiceLocationProvider

当我尝试定位其导航被控制的区域时(该区域与相关视图所属的区域不同)。

基于此,我进行了一些挖掘,但没有遇到任何关于解决 Prism 导航上下文中的“ServiceLocationProvider”错误的信息。如果可能的话,我宁愿避免嘲笑任何事情,但如果这最终成为唯一/最好的选择,那也不是不可能的。

如果我可以提供更多信息,请告诉我。感谢您提供的任何见解!

【问题讨论】:

  • ServiceLocationProvider 被配置为引导程序在 ConfigureServiceLocator() 方法中定义的引导顺序的一部分。您使用的是 Unity 还是 MEF?
  • 创建一个从 UnityBootstrapper 派生的基本 Bootstrapper,它将拥有您进行单元测试所需的一切。
  • 我不确定从哪里开始。你有什么我可以研究的资源吗?

标签: c# wpf unit-testing prism


【解决方案1】:

做了更多阅读,发现ServiceLocationProvider 是作为Bootstrapper.Run() 的一部分启动的。由于我不确定如何实现CreateShell,因此在创建虚拟引导程序时遇到了一些问题,但我意识到您可以返回一个新的DependencyObject

这是我的测试引导程序的样子:

 public class TestBootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return new DependencyObject();
    }
}

在测试开始时需要执行以下操作才能添加区域:

TestBootstrapper bootstrapper = new TestBootstrapper();
bootstrapper.Run();

this.RegionManager = new RegionManager();
this.RegionManager.Regions.Add(UIRegionNames.ContextResultsPane, new Region());

在正在测试的 ViewModel 的构造函数中,我执行以下操作来获取导航服务日志的实例:

public NavigationContextControlViewModel(IRegionManager regionManager)
{
    IRegionNavigationService navigationService;

    this.RegionManager = regionManager;
    navigationService = this.RegionManager.Regions[UIRegionNames.ContextResultsPane].NavigationService;
    navigationService.Navigated += CheckIfNavigateCanExecuteHasChanged;
    this.ContextResultsNavigationJournal = navigationService.Journal;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2011-06-28
    相关资源
    最近更新 更多