单元测试初始化​​故事板

Posted

技术标签:

【中文标题】单元测试初始化​​故事板【英文标题】:Unit Testing Initialising storyboard 【发布时间】:2015-08-01 11:08:08 【问题描述】:

有很多关于单元测试的资源,无论是纯粹的逻辑还是应用程序级别,我目前正在尝试测试在故事板中有 IBOutlets 的UITableViewCell,并且一些帖子已经确认我是否希望实例化故事板,然后是包含单元格的视图控制器。所以你必须通过几个步骤来确保故事板和后续元素像这样使用它们的 IBOutlets 正确加载

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.vc = [storyboard instantiateViewControllerWithIdentifier:@"testTableViewController"];
[self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];

后跟此代码从UITableViewController 获取UITableViewCell

[self.vc setTableViewData:@[@1].mutableCopy];
[self.vc.tableView reloadData];
[self.vc.tableView layoutIfNeeded];

SUT = [self.vc.tableView dequeueReusableCellWithIdentifier:@"More Menu Cell"
                                         forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

这会产生一个单元格,但是对我来说,我在被测系统内的第一个断点似乎表明 IBOutlets 已加载,但是当我真正去断言任何东西时,它们突然消失了一个我.. .

引用无缘无故消失,或者我做错了什么。

【问题讨论】:

【参考方案1】:

所以我做了一些我将在这里分享的发现,其中一个是我的问题的解决方案,而最初这个问题是我试图解决一个更大问题的一个小症状。

更大的问题是,我正在测试一些 UITableViewCells,但不幸的是,它们的 IBOutlets 从故事板连接到始终为零,这导致我试图弄乱应如何初始化被测系统。

我还发现使用 [self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES]; 的结果好坏参半,因为有时我仍然需要调用 viewviewDidLoad 才能正确初始化。所以我完全取消了它,只打电话给view,它似乎工作正常。

尽管我在上面进行了更改,但我的单元格仍然有 nil 出口。在互联网上翻找了一下之后,我发现,你应该只使用[self.tableView registerClass:[MyTableViewCell class]forCellReuseIdentifier:@"MytableViewcell"]; 如果它还没有在故事板中创建为原型单元。看起来它已经为你做了这个并且尝试再次这样做会破坏IBOutlets

另一个小发现是尝试通过这样的设置来测试我的UIViewController

MyViewController *SUT = [MyViewController new];
[SUT view];

现在虽然这个初始化了,但似乎还有一些缺失的步骤,因为这个类存在于情节提要中,因此我推荐以下

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SUT = [storyboard instantiateViewControllerWithIdentifier:@"My Table VC"];
[SUT view];  

【讨论】:

以上是关于单元测试初始化​​故事板的主要内容,如果未能解决你的问题,请参考以下文章

从代码进行故事板 UI 测试

来自故事板的表格视图单元原型未初始化子视图

swift in UI test(测试UITableView中的单元格数)

如何编写 UI 测试来测试单击 UITableView 中的第一个单元格时图像是不是存在?

如何将 Xcode 故事板表格单元格链接到其他故事板?

如何使用故事板中定义的单元格计算集合视图单元格高度?