哪些场景,应用程序/系统的区域等最适合"经典"基于状态的测试而不是使用模拟对象?
我将从TDD/BDD的角度来解决这个问题,测试正在推动设计.
首先,它取决于您购买的设计风格,因为请记住这是关于设计的第一个.正如Martin Fowler在这篇优秀文章中所讨论的那样,Mocks Are Not Stubs有两种思路,他们确实会产生不同类型的设计.
如果你想购买mockist方法,那么我强烈建议你从看看mockobjects网站和他们的文章Mock Roles,Not Objects开始.他们还有一本书出来了.
事实是即使您确实认为模拟优先设计风格不适合您,或者您不希望通过您的应用程序直接执行(例如,在测试您的域/服务层时),那么您仍然会想要使用测试双打.xUnit测试模式解释了不同类型的测试双打及其用途.
我个人从不模拟域类,所以从不嘲笑实体/值对象.然而,我最近一直在尝试模拟对象样式方法,它确实改变了我的设计,我觉得工作风格很舒服.在MVC应用程序中以这种方式工作我可能会从自动验收测试开始,然后我将编写一个模拟任何非域对象(例如存储库/服务)的控制器测试,然后我将继续测试那些存储库/服务再次嘲笑他们的依赖关系.当我到达一个没有麻烦的依赖关系的类时,我停止,例如域实体/值对象.我可以继续测试特定的角色接口,然后由我的域类实现,这是mockobjects的人会推荐的,但我目前看不到这种方法有很多价值.
显然值得补充的是,测试设计在这里很重要,但请记住,虽然90%的IoC/mocking/DIP示例显示了接口实现对(ICustomerRepository/CustomerRepository),但在寻找角色接口方面有很多价值.