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

时间:2015-08-05 17:12:02

标签: c# wpf unit-testing prism

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

  

必须设置ServiceLocationProvider

当我尝试找到导航被控制的区域时(该区域与所讨论的视图所属的区域不同)。

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

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

1 个答案:

答案 0 :(得分:3)

进行了一些阅读,发现ServiceLocationProviderBootstrapper.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;
}