如何正确地对我的数据访问层进行单元测试?

13

我对单元测试还很陌生。但我该如何对使用Entity Framework编写的DAL进行单元测试,以确保我的DAL代码能正确工作,但不会实际触及数据库?请尽可能详细地解答。

3个回答

17

如果你想测试你的数据访问层是否正确工作,那么在某个时刻你真的需要对其进行数据库测试,否则你实际上并没有测试它是否可用。


+1如果测试数据库不存在,那么真的应该创建一个(似乎 OP 关心数据更新)。 - Dana the Sane
1
Mocking的作用是什么?有人能解释一下它与测试数据库的作用吗? - Ray
2
一个测试数据库将用于运行集成测试(即数据访问层的测试)。模拟将用于替换数据访问层以进行单元测试,以便您仅测试逻辑而不实际访问数据库(例如,通过提供模拟来确保代码正确调用数据访问层)。 - Todd

5

在开发中,对数据访问层进行单元测试是一个非常普遍的头痛问题。就大部分情况而言,我建议您跳过它。

现在大多数ORM都提供某种类型的查询语言,例如LINQ或HQL等。因为适当的单元测试要求您不实际访问数据库,您必须模拟ORM,这是最麻烦的事情。在我看来,这不值得。最终,您只能测试您是否在代码中编写了正确的查询;您根本没有回归价值,并且可以通过检查代码更好地服务于您的目的。

我并不是说您不应该测试对数据访问层的使用,但是不要尝试进行单元测试。您仍然应该有一套集成和用户验收测试用于测试您的程序/系统;让它们处理数据访问的测试。


我喜欢上面答案中的评论,他们实际上提到了DAL测试是集成测试而不是单元测试。有了这个视角,它就不应该是一个痛苦的过程。测试你编写的查询是否正确非常重要,为此你应该测试它是否返回正确的结果。 - Juanu

4

当我对数据访问层进行单元测试时,我会使用事务并在单元测试结束时回滚,以使数据库保持清洁。


有趣,从没想过这个。我相信我可以谷歌一下,但你有如何做的代码片段吗? - Ray
虽然这并不是单元测试,但它是一个集成测试,这也没问题。许多框架都会将其集成测试指向单独的测试数据库,并在每个单独的测试上自动执行事务。 - Hates_
NUnit会自动进行测试的转换吗?如果是的话,我该如何配置它来完成这项任务? - Ray
有趣的方法,但说实话我不确定我会使用它,因为你没有完成操作。为什么不设置一个拆除方法来清理测试后的环境呢? - roundcrisis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接