.net 当使用MVP模式时,我可以将模型测试重用为视图测试吗?

.net 当使用MVP模式时,我可以将模型测试重用为视图测试吗?,.net,nunit,moq,mvp,.net,Nunit,Moq,Mvp,我正在使用MVP设计模式来构建我的应用程序的用户界面。MVP从一个模型类和一个视图接口开始。每当我创建一个新模型时,我都会为它编写单元测试,使用Moq模拟视图接口实现。这很有效 当我编写实际视图时,我也为它们编写单元测试。这些单元测试更难编写。我已经发明了一种写作技巧。技术是这样的:我复制模型测试,用实际实现替换模拟实现,并删除所有断言 结果是一组易于创建但非常有限的测试。他们所做的只是确认,当模型被设置并通过测试时,视图不会崩溃;它们不测试用户交互,也不测试视图的状态。然而,我发现使用这种技术

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

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

结果是一组易于创建但非常有限的测试。他们所做的只是确认,当模型被设置并通过测试时,视图不会崩溃;它们不测试用户交互,也不测试视图的状态。然而,我发现使用这种技术编写的测试几乎暴露了我所有的UI编码错误。因此,我为我的团队制定了这项技术标准实践

我的问题是:

  • 这种技术是否符合任何已知的编码实践或陷阱?我正在弥补这一点,但我更愿意遵循实践的标准

  • 有没有一种优雅的方法可以将模型单元测试重用为视图单元测试?目前,我在不同的测试中重复了很多代码,这让我很恼火,但我还没有找到更好的方法

-塞罗


PS:我专门问了一个关于MVP的问题,但我怀疑它适用于类和接口之间有密切关系的情况,并且两者都需要测试。

这个问题有点令人困惑,因为在MVP模式中,模型和视图并不总是相互连接,但我假设在这种情况下,它们确实存在,并且存在某种数据绑定。而且,听起来模型对视图有依赖性,而不是相反

也就是说,为了回答第一个问题,您在编写视图测试时实际做的是生成一个集成测试,即测试系统多个部分协同工作的功能。正如您所发现的,这在突出问题方面很有用。你错过了两件事:

  • 专门测试视图编程要处理的限制和边缘情况的条件
  • 视图是否按预期运行-在正确的位置显示值,具有功能按钮、链接等
  • 你应该考虑UI测试技术,可选地结合嘲笑模型和演示者。您没有提到您正在生成的UI类型,但是web和windows都有选项。对于后者(以及某种程度上的前者),可能是有用的。对于web,有一个或多个

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

  • 继承权。在两个测试类的基类中都有公共代码。根据NUnit和您的测试运行程序的能力,在基类上可能有公共测试方法,也可能没有。对于MSTest和XUnit,我最终在派生最多的类上重复了测试方法,并使用了包含真正大部分测试的受保护方法。大多数派生类负责为基类中的测试用例提供模拟依赖或真实依赖
  • 与(1)类似,公共代码位于不同的类中,而不是派生类。考虑到继承通常会导致代码混乱,最好默认使用派生类
  • T4模板可用于编写测试,并将其生成到两个不同的类中,每个类中具有不同的依赖项-mocked或real

  • 我希望以上所有内容都能帮助您更有效地进行测试!祝你好运。

    谢谢你的详细回答。随着我对测试的进一步了解,我逐渐形成了这样一种印象:它是一门不精确的科学,每个人都有足够的空间来发展自己的方法。我的方法恰好包括了一种不寻常的UI测试方法。不过,我必须承认,我的技术本身是站不住脚的;正如你所说,我需要一个全面的UI测试技术。我正在努力,但这是一条漫长的道路。顺便说一句,您关于使用和不使用实体框架进行测试的评论也是我应该做的——谢谢您的想法。