我们应该创建包含附加模拟的基础测试类吗?

时间:2014-09-26 07:43:02

标签: unit-testing

当我们有像

这样的课程时
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; }
}

提前致谢。

3 个答案:

答案 0 :(得分:4)

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

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

临:

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

缺点:

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

答案 1 :(得分:1)

除了Aaron Digulla的回答之外,我还想建议我的colleague's post一些例子。他称之为测试背景。我也使用这种方法。

答案 2 :(得分:0)

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