之前我问过这个问题 How to correctly unit test my DAL? ,我没有回答的一件事是,如果真正测试我的 DAL 是拥有一个测试数据库,那么模拟与测试数据库的作用是什么?
除此之外,另一个人建议“在单元测试结束时使用事务和回滚,所以数据库是干净的”,即测试数据库。你们如何看待这种测试 + 测试 DB + 事务回滚(因此 db 没有真正编写)测试 DAL 的方法?
完整地说,我的 DAL 是用 Entity Framework 构建的,DB 中没有存储过程。由于 EF 太新了,我真的需要测试 DAL 以确保它们正常工作。
最佳答案
我认为您可能需要进行一些集成测试来检查由您的数据库结构强制执行的逻辑,例如约束、触发器、自动增量列等。但是,对于单元测试,您应该模拟 DAL 的任何框架组件依赖于你想要的(在你的单元测试中)只测试你已经编码的那些组件。您实际上并不需要在 SqlCommand 或 SqlConnection 上测试方法(例如)。您应该假设您使用的框架组件可以工作并为它们创建 stub 或模拟,这些 stub 或模拟将已知数据(好的、坏的、异常)返回到您的方法,以确保您的方法正常工作。在不模拟的情况下,您负责在数据库中生成数据并确保它是正确的。您还会对网络、数据库本身等留下开放的依赖关系,这可能会使您的测试变得脆弱。
此外,单元测试并没有消除对其他类型测试的需要。集成测试和验收测试仍然有效,需要完成。它们可能不需要以与单元测试相同的频率完成,也可能不需要像单元测试提高代码质量那样广泛,但单元测试不是 Elixir 。
关于unit-testing - 模拟与测试数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/310307/