3

我很难为将其他几个 ViewModel 及其子级联系在一起的特定 ViewModel 编写测试。这是我的应用程序中最复杂的 ViewModel。

我的 ViewModel 的结构反映了视图的结构。它与它的孩子一起注射,它的孩子与他们的孩子一起注射。

模拟非常费力。

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

这是设计不佳的结果吗?
我的单元测试不正确吗?
是否有 AutoMockers 会递归地模拟我注入的参数?

4

2 回答 2

2

嗯,很容易说这是糟糕的设计,而且也可能如此。

但是,有些情况可能需要这样做。如果你确定你在其中一种情况下,那么你必须忍受它。如果它是您最复杂的虚拟机,那么测试它将是您最复杂的测试是合乎逻辑的。

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

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

于 2013-06-07T15:03:07.237 回答
2

Q2“我的单元测试是否不正确”的答案是“可能”。单元测试是关于孤立地测试单元。但有时很难做到。你有几个选择:

使 SubViewModel1 具有公开 SubViewModel2 可见性的属性,这样,在测试 MainViewModel 时,您将仅模拟/存根 SubViewModel1。当然,如果该属性确实有效,您将进行测试:)

现在,以上是从“纯粹”的角度来看的。有时,即使从 OO 设计的角度来看这是正确的做法,这样做也不实际。

因此,您可以尝试将 AutoFixture 作为自动模拟容器,它会准备嵌套模拟。

再次,检查您的设计,通常如果您发现某些东西难以测试,可能是它的构造不好,并且做得太多。

于 2013-06-07T15:07:00.307 回答