如何测试我的业务层?

时间:2010-11-22 09:22:45

标签: .net tdd moq rhino-mocks

去年我与TDD一起使用Moq和Rhino Mocks。我非常喜欢以这种方式开发,但是我已经在我的项目中找到了一点,我觉得这可能不是我需要做的事情。

我已经测试并开出了我的设计,一切正常。现在我在我需要测试的对象上面有一层。由于我有许多对象(通过接口使用控制反转),所以这些服务的存根和模拟似乎都是如此多的工作。在一次测试中,我必须先删除至少8个服务,然后才能测试我的代码。看起来好像编写了许多代码,这些代码没有真正的好处,而且非常费力。

我的问题是“有更好的方法吗?”这是行为驱动设计或其他方法更适合的地方,因为我没有真正进行单元测试吗?

3 个答案:

答案 0 :(得分:3)

仅在极少数情况下,您将拥有一个课程,具体取决于其他8个课程。

根据我的经验,只有MVVM中的ModelView可能具有如此大的依赖性。如果您的业务逻辑中有一个类依赖于 4 其他服务,我相信您需要重构您的代码。

理念是单一责任的原则,您将拥有更多的课程,但代码更少。

答案 1 :(得分:1)

如果您需要8项服务,则需要8个存根/模拟。我认为你不能避免这种情况。

如果你想减少编码,那么你可能也想重构你的单元测试,并为所有8个服务的设置代码创建一个层次结构或一些其他合适的OO商品。

修改

另外,你可以创建一个“megaobject”。假设8个服务实现了不同的接口: IService1 IService2 等等。在单元测试中,您可以创建一个对每个服务的接口进行分组的接口:

interface ISuperInterface: IService1, IService2, ... { }

然后你只需要模拟一个对象。

答案 2 :(得分:1)

单位级别的BDD更多地是关于心态和词汇而不是其他任何东西。如果我在不使用“测试”这个词的情况下考虑你的课程,只关注它的责任和行为,它可以帮助我找出可能出错的地方。我想如果你的班级需要8个服务来完成它的工作,也许它有太多的责任。你能否将其中一些职责委托给另一个班级,然后嘲笑那个?

场景级别的BDD实际上旨在帮助您思考整个系统的行为,范围和责任,并围绕它们进行对话。我认为它不会帮助您解决您正在谈论的课程的设计。但是,戴上我的BDD,我可以告诉你BDD不是关于测试。它是关于发现无知,解决它,然后传递这些知识,使代码变得容易和安全。

所以我建议做任何使代码变得容易和安全的事情。如果你正在写一些脆弱的测试,这些测试会在第一次有人改变某些东西时破坏,是的,也许可以把它提升到某个级别(对于场景和系统行为)。否则写一些更好的单元级示例并重构代码,如@Aliostad建议的那样。