测试IBOutlet自动连接或在未连接的插座上构建失败

时间:2013-04-03 10:44:32

标签: iphone ios unit-testing tdd iboutlet

有没有人设法自动单元测试IBOutlets子类上定义为UIViewController的所有属性在加载视图后连接(通过调用loadView)?

我的理解是IBOutlet已经过预处理,因此您无法在运行时计算出哪些属性为IBOutlets

或者,如果您定义了未连接的IBOutlets,是否还有另一种强制构建失败的方法?也许是一个LLVM编译器警告选项?

1 个答案:

答案 0 :(得分:2)

你可以使用一个断言,它可以让你快速失败(引起你的注意)。

- (void)viewDidLoad
{
  [super viewDidLoad];

  NSAssert(self.myLabel, @"IBOutlet not set for self.myLabel");
}

你可以将它包装在一个宏中来保存一些输入 - 也许是这样的

#define PASOutletAssert(outlet) NSAssert(outlet, @"IBOutlet not set for " @#outlet)

- (void)viewDidLoad
{
  [super viewDidLoad];

  PASOutletAssert(self.myLabel);
  PASOutletAssert(self.myOtherLabel);
}

保存一些打字的另一种变体可能如下所示 -

#define PASOutletsAssert(self, ...) _PASOutletsAssert(self, @"" # __VA_ARGS__)

void _PASOutletsAssert(id self, NSString *commaSeperatedKeyPaths)
{
  NSArray *keyPaths = [commaSeperatedKeyPaths componentsSeparatedByString:@", "];

  for (NSString *keyPath in keyPaths) {
    NSCAssert1([self valueForKeyPath:keyPath], @"IBOutlet not set for keypath - \"%@\"", keyPath);
  }
}

- (void)viewDidLoad
{
  [super viewDidLoad];

  PASOutletsAssert(self, myLabel, otherLabel, yellowSquare);
}