c# - 如何在 Prism 中设置 ServiceLocationProvider 进行单元测试导航?

标签 c# wpf unit-testing prism

我正在开发的 Prism/Unity 应用程序有一个 View ,负责实现 RegionNavigationJournal 的 GoBack()GoForward() 方法。这将是我第一次需要对使用 RegionManager 的任何内容进行单元测试,并且我遇到了一个错误建议

ServiceLocationProvider must be set

当我尝试找到导航受控制的区域时(该区域与相关 View 所属的区域不同)。

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

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

最佳答案

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

这是我的测试 Bootstrap 的样子:

 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;
}

关于c# - 如何在 Prism 中设置 ServiceLocationProvider 进行单元测试导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838797/

相关文章:

wpf - Application.Idle 事件未在 WPF 应用程序中触发

java - 从源类中拆分测试类?

c# - 以通用方式从 root 获取 XAML 中的子元素属性

c# - 使用 GetHashCode 获取 "secure"用户密码

c# - 将 EF 实体映射到维护 ICollection 和延迟加载的 ViewModel

Python unittest + asyncio 永远挂起

node.js - 无法连接到 fakeredis 实例(Nodejs + Redis + Fakeredis)

c# - C# try catch /错误处理

wpf - 从 WPF 的内部渲染到 Directx 应用程序

WPF ListBox图像选择的传奇继续