c# - Win10 UWP、Prism/Unity 和单元测试以及类库、静默失败

标签 c# unit-testing unity-container prism uwp

基本布局目前是一个简单的应用程序。没什么奇特的,我在 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/

相关文章:

c# - XAML UWA 滚动条不显示

c# - 如何替换字符串中每次出现的一组分隔符之间的任何特殊字符的所有实例?

c# - 单击超链接会导致更新面板执行完整回发吗?

java - Mockito 验证构造函数调用方法

c# - Unity DI 帐户 Controller 中的 IRepositories 为空

asp.net-mvc - 使用 Unity.Mvc5 将服务注入(inject) MVC View

c# - 在 C# 中高效地复制对称矩阵

python - 如何单元测试/模拟 requests.get(url) 及其响应

xcode - 测试方案的不同构建配置

c# - 最小起订量与 Unity 容器单元测试