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

本文关键字:单元测试 导航 设置 ServiceLocationProvider Prism | 更新日期: 2023-09-27 18:06:36

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

ServiceLocationProvider必须设置

当我试图定位其导航被控制的区域时(这是一个不同的区域,而不是问题视图所属的区域)。

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

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

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

进一步阅读,发现ServiceLocationProvider是作为Bootstrapper.Run()的一部分启动的。创建虚拟引导程序有一些问题,因为我不确定如何实现CreateShell,但我意识到你可以返回一个新的DependencyObject

下面是我的测试bootstrapper的样子:
 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;
}