8

免责声明:棱镜新手。我正在疯狂地阅读以弥补失去的时间:)

上下文:我需要为使用 Prism 构建的 WPF 应用程序编写自动化验收测试。

问题:我发现在没有 UI 的情况下尝试组合支持 ViewModel 和他们需要的一切是很复杂的。

我在这里可能错了... Prism 允许您使用命名占位符(区域)标记外壳。不同的模块(隔离单元)使用相应的 RegionNames 注册它们的视图。视图还依赖于通过 MEF/Unity 注入的 ViewModel(ctor 注入)。

  1. 显示视图
  2. 触发子视图的创建(regionName => View registry)
  3. 触发子视图模型的创建(Mef ctor 注入)。

因此,编写应用程序被委托给 Prism(或更重要的是 View)。这似乎是一种视图优先的方法。这会在没有 UI 的情况下启动应用程序。使用 UI 进行测试很痛苦。

我正在寻找的是一种演示者优先的方法,它在没有 UI 的情况下组成整个对象(ViewModel 和依赖项)图。

var viewModel = Someone.ComposeAndGet<ShellViewModel>();

Prism4 是否可以通过不同的方式编写应用程序或不支持?

[更新:2011 年 12 月]
http://compositewpf.codeplex.com/discussions/283065
发布在 prism 论坛上以获得更多信息;似乎这是不可能的。建议使用 UI 测试进行验收测试。Prism 组成 UI;因此对观点有至关重要的依赖性。

4

2 回答 2

3

我喜欢 Prism 框架,但我很少使用 Prism 的 Regions,因为我觉得它迫使我采用 View-First 方法。

我不喜欢使用 View-First,因为我觉得它消除了使用 MVVM 设计模式的一些优势,例如保持层分离和单元测试。如果您的视图负责创建您的视图模型,那么要测试您的视图模型,您需要创建视图来创建视图模型,或者您需要手动创建视图模型。

我还觉得一个理想的 MVVM 应用程序应该允许您使用任何 UI 甚至命令行运行应用程序,并且通过使用区域我将我的 ViewModels 限制为 Prism 界面。

有时我仍会使用 Prism 的区域,但通常只用于启动页面(例如 TitleBarRegion、MenuRegion、ContentRegion)

于 2011-12-05T15:06:43.807 回答
1

我不完全确定我理解这个问题,但是要对 prism 应用程序进行单元测试:

您可以使用 ServiceLocator 来检索 ViewModel:

MainViewModel mainVM = ServiceLocator.Current.GetInstance<MainViewModel>(); //That will "compose and get"

然后你可以随意对它进行单元测试。

也就是说,Prism 和一般的 MVVM 将大部分职责委托给 VM。视图只是数据的表示,它不包含任何逻辑。
虚拟机保存数据/逻辑并对它进行更改,而不知道它实际绑定到哪个视图。

希望这会有所帮助=)

于 2011-12-05T09:55:57.757 回答