42

我用GHUnit. 我想对私有方法进行单元测试,但不知道如何测试它们。我找到了很多关于为什么或为什么不测试私有方法的答案。但没有找到如何测试它们。

我不想讨论我是否应该测试私人,但会专注于如何测试它。

谁能给我一个如何测试私有方法的例子?

4

4 回答 4

115

Objective-C 中的方法并不是真正私有的。您收到的错误消息是编译器无法验证您正在调用的方法是否存在,因为它未在公共接口中声明。

解决这个问题的方法是在类类别中公开私有方法,这会告诉编译器这些方法存在。

因此,在测试用例文件的顶部添加如下内容:

@interface SUTClass (Testing)

- (void)somePrivateMethodInYourClass;

@end

SUTClass 是您正在为其编写测试的类的实际名称。

这将使您的私有方法可见,并且您可以在没有编译器警告的情况下对其进行测试。

于 2013-08-21T10:36:12.050 回答
7

有点晚了,但我刚上了 TDD 火车。

不应测试私有方法。因为您编写私有方法来支持您的公共方法,因此测试您的公共方法间接测试支持它们的私有方法。

“私有方法不应该被测试”的原则得到了“当你需要测试私有方法时,可能意味着你应该将这些方法移到单独的类中”的原则的支持,从而将它们公开。

于 2014-05-02T10:45:11.847 回答
4

如果一个方法是私有的,你永远不应该测试它。

想想这个。你应该测试你的方法的行为和契约而不是内部实现

于 2014-01-18T00:43:33.910 回答
4

同意@Lord Zsolt

另请注意下一个(来自测试驱动的 iOS 开发ISBN-10:0-321-77418-3,ISBN-13:978-0-321-77418-7)

测试私有方法

我经常被问到,“我应该测试我的私有方法吗?” 或相关问题“我应该如何测试我的私有方法?” 问第二个问题的人假设第一个问题的答案是“是”,现在正在寻找一种方法来在他们的测试套件中公开他们的类的私有接口。

我的回答依赖于对一个微妙事实的观察:你已经测试了你的私有方法。通过遵循测试驱动开发中常见的红绿重构方法,您设计了对象的公共 API 来完成这些对象需要完成的工作。通过测试指定的工作——以及测试的持续执行确保你没有破坏任何东西——你可以自由地组织你认为合适的类的内部管道。您的私有方法已经过测试,因为您所做的只是重构您已经测试过的行为。

您永远不应该陷入私有方法未经测试或未完全测试的情况,因为您只有在看到有机会清理公共方法的实现时才创建它们。这确保了私有方法的存在只是为了支持类的公共行为,并且必须在测试期间调用它们,因为它们肯定是从公共方法调用的。

于 2015-08-31T06:13:40.710 回答