c# - 如何对具有多个子层的根 ViewModel 进行单元测试?

标签 c# wpf unit-testing mvvm moq

我在为特定 ViewModel 编写测试时遇到困难,该 ViewModel 将多个其他 ViewModel 及其子级联系在一起。它是我的应用程序中最复杂的 ViewModel。

我的 ViewModel 的结构反射(reflect)了 View 的结构。它被注入(inject)它的 child ,它的 child 被注入(inject)他们的 child 。

mock 很费力。

由于依赖链,模拟非常耗时。例如,假设我有 MainViewModel.SubViewModel1.SubViewModel2 结构,但我最终不得不模拟多个层,因为 MainViewModel 中的操作可能导致 SubViewModel1 需要检查 SubViewModel2 的可见性。

这是设计不良的结果吗?
我的单元测试不正确吗?
是否有 AutoMockers 可以递归模拟我注入(inject)的参数?

最佳答案

嗯,很容易说它是糟糕的设计,而且往往也是如此。

但是有些情况可能需要这样做。如果您确定自己属于其中一种情况,那么您就必须忍受它。如果它是您最复杂的 VM,那么测试它就是您最复杂的测试是合乎逻辑的。

  • 对于功能测试,由于其中的操作会影响其他孙子 VM 的属性(根据您的依赖项),如果有效,您的测试应该测试所有这些,这意味着您不能也不应该真的 mock 他们就好像你这样做一样,你没有真正正确地测试该 VM。
  • 现在对于单元测试,您只关心这个 VM,因此您的模拟应该只针对直接子依赖项。即使逻辑需要孙子,您也可以让模拟层 VM 模拟它并相应地返回结果。所以在 99% 的情况下,你的测试 VM 最多只有一层 child (排除总是适用于这些事情)

最后,我希望您的 VM 之间确实有一些接口(interface)结构,以帮助您相应地模拟 VM。这将在您使用 IoC 容器这样的情况下为您提供帮助,您可以在测试中只注入(inject) Mock VM 而不是实时的。这可以是 VM 本身的接口(interface),也可以是很多人更喜欢将这些行为提取到服务中。

关于c# - 如何对具有多个子层的根 ViewModel 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986488/

相关文章:

c# - 具有卡住列的 wpf 网格

c# - 配置了一个应用程序时,没有为应用程序注册回复地址

sql - 如何对 ServiceStack 进行单元测试?

node.js - mocha 应该预料到超时,超时时调用 done()

c# - 在 Microsoft 测试资源管理器中创建具有相同工作项 ID 的测试方法的播放列表

c# - 将锁与 Threading.Timer 一起使用

wpf - 获取 wpf WriteableBitmap 的 DrawingContext

laravel - 使用 Laravel 进行单元测试

c# - 将 C# 库移植到 Windows Phone 8?

c# - BlockingCollection worker 需要通过匿名函数返回一个值