我希望这三个类别按顺序运行,只有在 前一个通过。这是否正确?
不可以。您应该单独测试所有内容,因为任何失败的数据访问代码都应该与视图完全无关。因此,视图单元测试应该会因完全不同的原因而失败,因此您应该始终运行所有测试。
一般来说,测试应该单独运行,不应该依赖于任何其他测试。在我看来,视图层仍然依赖于数据访问代码,但是您只抽象出下面的图层。在这种情况下,从视角来看,你正在嘲笑一种间接的依赖关系,这使得你的单元测试比严格需要的更复杂。
我们这样做是使用依赖注入 框架是一个奇怪的方法来模拟测试
我不知道,如果我得到这个旧的方式,但它好像你在单元测试中使用DI容器。这是一个绝对的禁忌。不要让任何DI框架混淆你的测试。而且没有必要。只需围绕依赖注入原则设计你的类(将所有依赖作为构造函数参数公开),并且在你的测试中,你只需用假依赖关系手动新建被测试类即可 - 或者当这导致重复代码时,在你的测试中创建一个工厂方法类创建被测试类的新实例。
实际上,我们创建了一个模拟类为每个数据访问,这吮吸
我不知道,但它听起来好像有什么东西不对您的设计在这里。您通常会有一个IRepository<T>
接口,您可能会有多个实现,如UserRepository : IRepository<User>
和OrderRepository : IRepository<Order>
。在你的测试套件中,你将有一个通用的FakeRespository<T>
或InMemoryRepository<T>
,你就完成了。无需在这里模拟许多课程。
这里有两个伟大的著作,你一定要读:
- The Art of Unit Testing
- Dependency Injection in .NET
这些图书会改变你的生活。而且既然你会阅读,也请阅读this book(不涉及你的问题,但代码也是一个改变生活的人)。
你能告诉我更多关于'FakeRepository'吗?如果必须模拟许多其他类,那么如何设计该类?它基本上是模拟在哪里访问数据库并返回模拟数据而不是通过数据库? –
另外,对于DI框架,您会推荐什么? –
我写了简单的注射器,所以我不是写的人问:-) – Steven