使用RhinoMocks测试私有方法

时间:2012-07-09 19:29:41

标签: c# tdd rhino-mocks

我在TDD环境中工作,基本上我面临着一个两难的问题,我认为这在TDD环境中非常重要。作为程序员,您希望您的方法尽可能可读。为此,我们倾向于在多个私有方法中对方法进行分区。在这样做时,所有移动到私有函数的代码都失去了它的测试能力。

Rhino测试类无法看到所有这些私有方法,我也需要能够针对这些方法运行测试。我不希望它们被公开,因为将它们公开是没有意义的。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

如果我问你问题的一部分:

  

[...]我们倾向于在多个私有方法中对我们的方法进行分区[...]

这是错误的。如果您遵循single responsibility principle和良好的OOP设计,您的方法将更加独立和简单。如果您想要提取另一个私有方法以使您的 public 看起来更短,请先考虑一下。也许,你可以在一个单独的类中重构它吗?

您不测试私有方法,因为您测试公共合同而不是实施细节。如果您希望获得与私有方法测试类似的内容,请将它们设为内部并设置InternalsVisibleTo属性。

另一种方法(R. Harvey指出)是编写一个包装类,将私有方法包装到 public 方法中。这种方法的好处是您不需要将私有方法内部。缺点是,对于每个私有方法,您将拥有一个包装器 public 方法。所以方法的数量可能会翻倍。

答案 1 :(得分:3)

正如其他人所建议的,测试非公共方法的一种方法是将它们设为内部并使用InternalsVisibleTo属性。但是,我强烈建议不要这样做。

通过测试使用它们的公共方法,单元测试应涵盖私有方法。当然,随着时间的推移并且您在测试的类中添加了更多功能,设置测试会变得越来越复杂。这是一个很好的指标,表明该课程有太多的责任,你应该将它分成多个较小的类。然后,您可以将这些较小的类作为原始类的依赖并在测试中模拟它们 - 这将再次简化测试。

在执行此操作时,您不必完全放弃私有方法 - 使用它们可以在不使用注释的情况下使代码更具可读性。