使用MVP模式时,我可以重用模型测试作为视图测试吗?

时间:2014-01-18 19:40:07

标签: .net nunit moq mvp

我正在使用MVP设计模式来构建我的应用程序的用户界面。 MVP以模型类和视图接口开始。每当我创建一个新模型时,我都会为它编写单元测试,使用Moq模拟视图接口实现。这很有效。

当我写实际视图时,我也会为它们编写单元测试。这些单元测试更难写。我开发了一种编写其中一些的技术。技术是:我复制模型测试,用实际实现替换模拟实现,并删除所有断言。

结果是一组易于创建但非常有限的测试。他们所做的就是确认在建立并完成模型时视图不会崩溃;它们不测试用户交互,也不测试视图的状态。不过,我发现使用这种技术编写的测试几乎暴露了我的所有UI编码错误。因此,我已经为我的团队制定了这种技术标准练习。

我的问题:

  • 这种技术是否符合任何已知的编码习惯或陷阱?我正在努力做到这一点,但我更愿意遵循惯例标准。

  • 是否有一种优雅的方法可以将模型单元测试重用为视图单元测试?目前,我在不同的测试中重复了很多代码,并且令人感到沮丧,但我还没有找到更好的方法。

-Cyro

PS:我已经专门询问了关于MVP的问题,但我怀疑只要一个类和一个接口之间存在密切关系,它就适用,并且都需要测试。

1 个答案:

答案 0 :(得分:0)

这个问题有点令人困惑,因为在MVP模式中,模型和视图并不总是彼此接口,但在这种情况下我会假设他们这样做并且存在某种数据绑定。此外,它听起来模型依赖于视图,而不是相反。

话虽如此,为了回答第一个问题,看来你正在编写View测试的方式实际上是在进行集成测试,即测试系统的多个部分协同工作的功能。正如您所发现的那样,在突出问题时这很有用。你错过的是两件事:

  1. 专门测试视图编程处理的限制和边缘情况的条件。
  2. 视图是否按预期运行 - 在正确的位置显示值,具有正常工作的按钮,链接等。
  3. 您应该考虑使用UI测试技术,可选择结合模拟模型和演示者。您还没有提到您正在生成的UI类型,但Web和Windows都有选项。对于后者(在某种程度上是前者),Coded UI Tests可能是有用的。对于网络,有SeleniumWatiNCoded Web Test

    要回答第二个问题,我有类似的经验,因为我发现重复使用相同的测试代码来测试有和没有实体框架模拟的代码是有用的。为了实现这一点,几乎不需要重复代码。您可以使用一些标准技术:

    1. 继承。在两个测试类的基类中使用公共代码。根据NUnit和测试运行器的功能,可能有也可能无法在基类上使用公共测试方法。使用MSTest和XUnit,我最终在最派生的类上重复测试方法,并且使用包含真正大量测试的受保护方法。派生类最多的类负责为基类中的测试用例提供模拟或实际依赖。
    2. 与(1)类似,公共代码在不同的类中,而不是派生类。鉴于继承通常最终导致代码混乱,默认使用派生类可能更好。
    3. 可以使用T4模板编写测试并将它们生成为两个不同的类,每个类具有不同的依赖关系 - 模拟或真实。
    4. 我希望以上所有内容能够帮助您更有效地进行测试!祝你好运。