基本布局目前是一个简单的应用程序。没什么奇特的,我在 App.Views
命名空间中拥有 View ,在 App.ViewModels
命名空间中拥有我的 ViewModel。 ViewModel 通过 XAML 指令自动连接到 View:
xmlns:prismMvvm="using:Prism.Windows.Mvvm"
prismMvvm:ViewModelLocator.AutoWireViewModel="True"
所以,基本上,这是可行的。然后我想利用 Unity 的 IoC/DependencyInjection 进行一些单元测试。
通常的方法是简单地将 Windows 10 单元测试应用添加到现有应用,并在单元测试应用中引用后者。
这将在执行单元测试时崩溃,因为您似乎无法从除 Application
之外的任何其他类派生 App
类。
IE。这有效:
public sealed partial class App : Application
这不会:
public sealed partial class App : PrismUnityApplication
这可能也不是 Prism 的错,微软必须解决这个问题。
现在,建议的解决方法是简单地将您想要进行单元测试的任何内容放入类库中,并从单元测试应用程序引用该库。这适用于单元测试。它也适用于模型。
但是,我的天真的方法对于 ViewModel 不起作用。像以前一样,ViewModel 类仍然可以在 App.ViewModels
命名空间下找到,只是它们现在位于类库中。我可以在主应用程序中以编程方式访问它们。但是在运行程序时,AutoWiring 会默默地失败,并且没有错误。
即使我做了这样的事情,它仍然不起作用:
ViewModelLocationProvider.Register(typeof(MainPage).ToString(), () => new ViewModels.MainPageViewModel());
我对所涉及的技术还没有那么丰富的经验,所以如果没有实际的错误,我会有点不知所措。
编辑:只是为了增加神秘感 - 无论 ViewModel 是否驻留在主应用程序或类库中,此代码都可以工作:
var x = Container.Resolve(typeof(ExamplePageViewModel)) as ExamplePageViewModel;
最佳答案
您是对的,这通常是 UWP 应用程序可测试性的限制。目前 UWP 应用的可测试性还不完善。为了解决第一个问题,您需要将 BindableAttribute 添加到您的应用程序类中:
[Bindable]
sealed partial class App : PrismUnityApplication
{
}
就将 View / View 模型拉出到单独的程序集中而言,此问题是由于 UWP 如何处理来自单独程序集的加载类型造成的。尽管如此,这不应该阻止您测试 ViewModel。您可以使用常规类库来测试 ViewModel 逻辑。你会 mock 你的依赖。您不应该创建 View 实例来测试 View 模型。因此 ViewModelLocator 不再是问题。
关于c# - Win10 UWP、Prism/Unity 和单元测试以及类库、静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857338/