【问题标题】:When to perform my unit test and why use Moq何时执行我的单元测试以及为什么使用 Moq
【发布时间】:2013-06-27 15:44:35
【问题描述】:
Q1:什么时候运行单元测试比较理想?每次我去调试应用程序之前都应该运行它吗?是否应该在我提交对 svn 的更改之前运行它们?我认为如果一个应用程序只有几个单元测试,则应该在每次应用程序即将调试时运行它。但是可以说我们数百个单元测试可能需要一些时间才能完成,不确定这是否理想。我认为最好在提交或部署之前运行它们。
Q2:在我的应用程序中,我使用带有服务层的存储库模式。当服务正在调用存储库并且存储库正在查询数据库时,我已经对如何测试服务进行了一些研究。所以为了让它成为真正的单元测试而不是集成测试,我必须找到一种方法来测试而不接触数据库。我发现人们正在使用 Moq 来模拟他们的存储库。这就是我遇到问题的地方,对我来说,如果我模拟一个存储库,那么我正在改变该方法应该如何工作的行为,对我来说似乎是一个毫无意义的单元测试。您似乎并未真正测试 您的 代码。我对此完全错了吗?感谢您的建议。
【问题讨论】:
标签:
unit-testing
testing
moq
repository-pattern
【解决方案1】:
让我拍一张。
A1:重构现有代码时,您应该执行相应的单元测试(不是全部),看看您的更改是否有任何问题。对于新功能,您应该使用 TDD 并行实施新的单元测试。您永远不应该自己执行所有单元测试,而应该使用或依赖持续集成。
A2:我和你有同样的看法。但是现在,我确信需要对服务层进行单元测试。应该涵盖使用单元测试可以涵盖的任何内容。此时,您的服务的核心可能只是对存储库的委托,但服务会不断发展。这些服务负责参数验证、授权、日志记录、事务、批处理支持 API 等。然后,它不仅是数据访问,还有更多的事情。如果我在你的位置,我会通过模拟存储库来对服务进行单元测试。有时,服务会在存储库之上提供方便的方法。
希望对你有所帮助。
【解决方案2】:
A1。对代码进行更改时,您运行单元测试的频率越高,您将越快获得有关它们被写入断言的行为是否受到影响的反馈,因此越频繁越好!单元测试应该非常快,运行几百个应该最多只需要几分钟,但可能值得研究infinitest(如果使用 java,我希望 .net 等存在替代方案)它是eclipse 的插件,并在 eclipse 构建项目时自动运行单元测试。只运行自上次运行以来受到影响的测试就足够聪明了,例如如果你更新了一个测试,或者你更新了一些单元测试所涵盖的“应用”代码,那么特定的测试将会被执行。
A2。单元测试会覆盖很多不同的场景,会多次调用你的服务+daos,使用“真实”的服务会很难保证每次调用的结果(而且每次测试都设置数据会很痛苦),而且结果可能很慢。模拟这些服务并通过集成测试独立测试它们的单元测试通常会更好。