我们是否应该创建包含其他模拟的基本测试类



当我们有一个类似这样的类时

class IntoController(IViewModelCreator viewModelCreator) {}

class ProductController(ICommandFactory commandFactory, IViewModelCreator viewModelCreator) {}

class ProductController(ICommandFactory commandFactory, IViewModelCreator viewModelCreator, IRepository repository) {}

等等。每次模拟此接口都需要花费大量时间。您如何看待包含大量模拟的通用类?

class BaseControllerUnitTests
{
    protected Mock<IViewModelCreator> ViewModelCreator { get;set; }
    protected Mock<ICommandFactory> ViewModelCreator { get;set; }
    protected Mock<IRepository> ViewModelCreator { get;set; }
}

提前谢谢。

我实际上是这样做的;我只是将它们保存在一个名为 TestDataFactory 的不同类中,这样我就不会遇到继承问题(以防万一我必须在测试中扩展其他一些基类(。

工厂不应该是全局/静态的(见下文(。

优点:

  • 所有测试都可以在一个地方获取有效的对象图
  • 如果对象图发生变化,只有一个地方可以修复所有测试
  • 您可以在工厂中保留对模拟的引用,以模拟内部方法调用(即,您可以请求ProductController,稍后,当您请求ICommandFactory时,您将获得注入控制器的那个(。

缺点:

  • 测试工厂将变得相当大。最终,您必须将其拆分为多个文件。
  • 并非所有测试都需要完全相同的模型。有时,您需要插入一个真实的对象。我的解决方案是允许覆盖工厂保留的引用。但它使代码更加笨拙。

除了Aaron Digulla的回答之外,我还想用一些例子来推荐我同事的帖子。他称之为测试上下文。我几乎也使用这种方法。

你正在编写测试代码的事实并不意味着所有的软件工程最佳实践都应该被淘汰。如果您在测试之间有一个通用功能的子集(在这种情况下 - 模拟测试类的某些方法(,那么是的,无论如何 - 您可以提取基类。

最新更新