公开私有财产与类别

时间:2014-03-08 00:31:02

标签: objective-c unit-testing objective-c-category

我想公开一个视图控制器的私有属性,以便我可以测试它们。一种方法是在类上创建一个仅用于测试的类别,并使用类别方法来获取值。

// Class I want to test -- implementation
#import "SomeViewController.h"

@interface SomeViewController ()
@property (strong, nonatomic)UIActionSheet *sheet;
@end

// Category's header
#import "SomeViewController.h"

@interface SomeViewController (Test)
-(UIActionSheet *)getSheetValue;
@end

// Category's implementation
#import "SomeViewController+Test.h"

@implementation SomeViewController (Test)
-(UIActionSheet *)getSheetValue{
    return self.sheet;    // references private property
}
@end

有更好的方法吗?我想也许我可以在引用私有属性值的类别上创建一个公共sheet属性,但找不到任何关于如何去做的好文档。在不依赖ivars的情况下测试私有财产的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

私下您需要的方法已经存在,该类别只需要让它们对测试可见:

@interface SomeViewController (Test)

- (UIActionSheet *) sheet;

@end

您不需要实现该方法,但现在您可以使用它。如果使方法可见但在运行时实际上不存在,则只会出现问题。

答案 1 :(得分:0)

您也可以使用valueForKey:,但它不是“干净”,因为您没有自动完成,如果您通过重构工具重命名该属性,可能会中断。但如果您不想创建类别,那么这是另一种选择。