单元测试 (XCTest) NIB Outlets 为零

Posted

技术标签:

【中文标题】单元测试 (XCTest) NIB Outlets 为零【英文标题】:Unit test (XCTest) NIB Outlets are nil 【发布时间】:2015-11-08 05:30:20 【问题描述】:

我想通过 XCTest 测试网点设置是否正确。我想分享我目前的方法:以编程方式分配 VC 并检查 outlet 是否不为零。我认为应该直截了当,但测试失败了。

MyViewController *mvc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

[mvc awakeFromNib];
XCTAssert([mvc tableViewOutlet], @"Table view should be hooked up");

我想知道我是否遗漏了一些明显的东西?

【问题讨论】:

测试的主包可能与应用程序的主包不同,因此找不到NIB。 好的,但是怎么可以通过initWithNibName进行分配呢? mvc 是 != nil 只是为了澄清。解决方案是什么?我应该在目标的 Copy Bundle Resources 中添加 .xib 吗? 您可以将 nil 传递给 nib 名称和捆绑包,但仍然可以取回视图控制器,该 init 方法永远不会失败。 【参考方案1】:

根据这个问题 XIB outlets unit testing

我发现 NIB 是延迟加载的。您必须调用 [mvc loadView] 才能连接所有插座。

【讨论】:

NIB 是延迟加载的,但加载它们的适当方法是访问view 属性,而不是直接调用loadView,因为该问题的答案表明您是否仔细阅读。 在这种情况下,人们会执行 [mvc.view subViews] 并找到 tableView 或正在测试的那个,对吧?如果您想测试 nib 中不是视图的其他对象,即数组控制器,该怎么办? 一旦您使用[mvc view]; 强制加载,您就可以照常访问您的IBOutlets。我只是建议您使用[mvc view]; 而不是[mvc loadView];,因为它会调用视图加载机制,因为它通常会被调用(通常您不会直接调用 loadView)。

以上是关于单元测试 (XCTest) NIB Outlets 为零的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 XCTest 对 Touch Id 进行单元测试?

使用 XCTest 在单元测试期间接收通知?

iOS 中的 XCTest 和 UI 测试

单元测试不了解 XCTest 期望的异步 UI 代码?

iOS 单元测试- Xcode 7测试工具XCTest学习

iOS:使用 XCTest 对 UIViewController 组件进行单元测试