去年夏天,我正在开发一个基本的 ASP.NET/SQL Server CRUD 应用程序,单元测试是其中一项要求。当我尝试对数据库进行测试时遇到了一些麻烦。据我了解,单元测试应该是:
- 无国籍
- 彼此独立
- 可重复使用相同的结果,即没有持续的变化
在为数据库开发时,这些要求似乎相互矛盾。例如,如果不确保要插入的行不存在,我就无法测试 Insert(),因此我需要先调用 Delete()。但是,如果他们不在那里呢?然后我需要先调用 Exists() 函数。
我的最终解决方案涉及非常大的设置功能(糟糕!)和一个空的测试用例,它将首先运行并表明设置运行没有问题。这是牺牲了测试的独立性,同时保持了它们的无国籍状态。
我发现的另一个解决方案是将函数调用包装在可以轻松回滚的事务中,例如Roy Osherove 的 XtUnit。这项工作,但它涉及另一个库,另一个依赖项,对于手头的问题,它似乎有点过于繁重。
那么,SO 社区在遇到这种情况时做了什么?
tgmdbm 说:
您通常使用您最喜欢的自动化单元测试框架来执行集成测试,这就是为什么有些人会感到困惑,但他们不遵循相同的规则。您可以参与许多类的具体实现(因为它们已经过单元测试)。您正在测试您的具体类如何相互交互以及如何与数据库交互。
所以如果我没看错的话,真的没有办法有效地对数据访问层进行单元测试。或者,数据访问层的“单元测试”是否涉及测试,例如,由类生成的 SQL/命令,独立于与数据库的实际交互?