1

在MVC4 C#网站中,我们使用单元测试来测试我们的代码。我们目前正在做的是建立一个模拟数据库,然后测试每一层:Visual Studio 2012中的依赖(程序)单元测试

  1. 测试数据库 - 连接,初始化,负载等
  2. 测试代码访问数据库
  3. 测试视图层

我希望这三个类别按顺序运行,并且只有在前一个类别通过。这是否正确?我们这样做的旧方法是使用依赖注入框架,这是模拟测试的一种奇怪的方法。实际上,我们为每个数据访问者创建了一个模拟类,这很吸引人,因为我们必须重新实现每种方法的逻辑,而且它没有真正增加任何价值,因为如果我们第一次在逻辑上犯了错误,我们会让它成为第二个。

回答

3

我希望这三个类别按顺序运行,只有在 前一个通过。这是否正确?

不可以。您应该单独测试所有内容,因为任何失败的数据访问代码都应该与视图完全无关。因此,视图单元测试应该会因完全不同的原因而失败,因此您应该始终运行所有测试。

一般来说,测试应该单独运行,不应该依赖于任何其他测试。在我看来,视图层仍然依赖于数据访问代码,但是您只抽象出下面的图层。在这种情况下,从视角来看,你正在嘲笑一种间接的依赖关系,这使得你的单元测试比严格需要的更复杂。

我们这样做是使用依赖注入 框架是一个奇怪的方法来模拟测试

我不知道,如果我得到这个旧的方式,但它好像你在单元测试中使用DI容器。这是一个绝对的禁忌。不要让任何DI框架混淆你的测试。而且没有必要。只需围绕依赖注入原则设计你的类(将所有依赖作为构造函数参数公开),并且在你的测试中,你只需用假依赖关系手动新建被测试类即可 - 或者当这导致重复代码时,在你的测试中创建一个工厂方法类创建被测试类的新实例。

实际上,我们创建了一个模拟类为每个数据访问,这吮吸

我不知道,但它听起来好像有什么东西不对您的设计在这里。您通常会有一个IRepository<T>接口,您可能会有多个实现,如UserRepository : IRepository<User>OrderRepository : IRepository<Order>。在你的测试套件中,你将有一个通用的FakeRespository<T>InMemoryRepository<T>,你就完成了。无需在这里模拟许多课程。

这里有两个伟大的著作,你一定要读:

  1. The Art of Unit Testing
  2. Dependency Injection in .NET

这些图书会改变你的生活。而且既然你会阅读,也请阅读this book(不涉及你的问题,但代码也是一个改变生活的人)。

+0

你能告诉我更多关于'FakeRepository '吗?如果必须模拟许多其他类,那么如何设计该类?它基本上是模拟在哪里访问数据库并返回模拟数据而不是通过数据库? –

+0

另外,对于DI框架,您会推荐什么? –

+0

我写了简单的注射器,所以我不是写的人问:-) – Steven