如何为 Prism 中的单元测试导航设置 ServiceLocationProvider?

How to set up ServiceLocationProvider for unit testing navigation in Prism?

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

ServiceLocationProvider must be set

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

基于此,我进行了一些挖掘,但没有发现任何有关解决 Prism 导航上下文中的 "ServiceLocationProvider" 错误的信息。如果可能的话,我宁愿避免模拟任何东西,但如果最终成为 only/best 选项,那也不是不可能的。

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

阅读更多内容后发现 ServiceLocationProvider 是作为 Bootstrapper.Run() 的一部分启动的。在创建虚拟引导程序时遇到了一些问题,因为我不确定如何实现 CreateShell,但我意识到你可以 return 一个新的 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;
}