单元测试Xcode中的私有方法

Abi*_*ern 63 tdd xcode cocoa objective-c ocunit

我正在尝试玩具项目中的测试驱动开发.我可以让我的类的公共接口的测试工作(虽然我仍然在围栏,因为我正在编写比测试方法更多的测试代码).

我倾向于使用很多私有方法,因为我喜欢保持公共接口干净; 但是,我还是想对这些方法进行测试.

由于Cocoa是一种动态语言,我仍然可以调用这些私有方法,但是在我的测试中我得到警告,我的班级可能不会对这些方法做出反应(虽然它显然是这样).由于我喜欢在没有警告的情况下进行编译,因此我的问题是:

  1. 如何在Xcode中关闭这些警告?
  2. 我还能做些什么来关闭这些警告吗?
  3. 我在尝试"白盒子"测试时做错了什么?

Qui*_*lor 125

请记住,在Objective-C中实际上没有"私有方法"这样的东西,而且这不仅仅是因为它是一种动态语言.根据设计,Objective-C具有适用于ivars的可见性修饰符,但不适用于方法 - 您可以调用任何您喜欢的方法,这不是偶然的.

@Peter的建议很棒.为了补充他的答案,我使用的替代方法(当我不想/需要仅用于私有方法的标题时)是在单元测试文件本身中声明一个类别.(我用它@interface MyClass (Test)作为名称.)这是添加在发布代码中不必要膨胀的方法的好方法,例如访问被测试类可以访问的ivars.(当使用属性时,这显然不是问题.)

我发现这种方法可以很容易地公开和验证内部状态,以及添加仅测试方法.例如,在这个单元测试文件中,我编写了一个-isValid验证二进制堆正确性的方法.在生产中,这种方法会浪费空间,因为我假设堆是有效的 - 如果我修改代码,我在测试单元测试回归时只关心它.

  • 很棒的建议!我更喜欢这个想法,保持方法在上下文中的曝光. (4认同)

Pet*_*sey 89

如何在Xcode中关闭这些警告?

别.

我还能做些什么来关闭这些警告吗?

别.

我在尝试"白盒子"测试时做错了什么?

没有.

解决方案是将您的私有方法移动到其自己的标头中的类别.将此标头导入实际类和测试用例类实现文件.

  • +1 - 很棒的建议!有关更多详细信息,请查看此问题/答案:http://stackoverflow.com/questions/1020070/#1020330例如,包含具有私有方法的类别的私有标头可以命名为MyClass_Private.h. (4认同)
  • 谢谢你的回答.我仍然不确定,但我必须承认,有一个"有趣"的元素来编写测试,然后让它通过. (2认同)