使用RhinoMocks测试私有方法

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

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

有任何想法吗?

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

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

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

您不测试私有方法,因为您测试公共合同而不是实现的详细信息。 如果您想要使用与私有方法测试类似的东西,请将它们设置为内部并设置InternalsVisibleTo属性。

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

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

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

在这样做时,您不必完全放弃私有方法 – 使用它们是一个好主意,使您的代码更易于阅读而不使用注释。