单元测试初始化故事板
Unit Testing Initialising storyboard
有很多关于单元测试的资源,无论是纯逻辑还是应用程序级别,我目前正在尝试测试一个 UITableViewCell
,它在故事板中有 IBOutlets 并且一些帖子已经确认我是否希望实例化故事板,然后实例化包含单元格的视图控制器。所以你必须通过几个步骤来确保情节提要和后续元素正确加载它们的 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 已经加载,但是当我真正去声明任何东西时,它们突然消失了...
要么是引用无故消失,要么是我做错了什么。
所以我有一些发现,我将在这里分享,其中之一是我的问题的解决方案,而最初这个问题是我试图解决一个更大问题的一个小症状。
更大的问题是,我正在测试一些 UITableViewCells,但不幸的是,它们的 IBOutlets 从故事板连接,但始终为 nil,这导致我试图弄乱被测系统的初始化方式。
我还发现使用 [self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
的结果不一,因为有时我仍然需要调用 view
或 viewDidLoad
才能正确初始化。所以我完全取消了它,只是调用 view
,它似乎工作正常。
然而,尽管我进行了上述更改,但我的电池仍然没有插座。在互联网上翻找了一下后,我发现,你应该只使用 [self.tableView registerClass:[MyTableViewCell class]forCellReuseIdentifier:@"MytableViewcell"];
如果它还没有在故事板中创建为原型单元格。 看起来它已经为您做这件事并尝试再次做这件事会破坏 IBOutlets
。
另一个小发现是试图通过这样设置来测试我的 UIViewController
MyViewController *SUT = [MyViewController new];
[SUT view];
现在虽然初始化了,但似乎又缺少了一些步骤,因为这个 class 存在于情节提要中,因此我推荐以下内容
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SUT = [storyboard instantiateViewControllerWithIdentifier:@"My Table VC"];
[SUT view];
有很多关于单元测试的资源,无论是纯逻辑还是应用程序级别,我目前正在尝试测试一个 UITableViewCell
,它在故事板中有 IBOutlets 并且一些帖子已经确认我是否希望实例化故事板,然后实例化包含单元格的视图控制器。所以你必须通过几个步骤来确保情节提要和后续元素正确加载它们的 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 已经加载,但是当我真正去声明任何东西时,它们突然消失了...
要么是引用无故消失,要么是我做错了什么。
所以我有一些发现,我将在这里分享,其中之一是我的问题的解决方案,而最初这个问题是我试图解决一个更大问题的一个小症状。
更大的问题是,我正在测试一些 UITableViewCells,但不幸的是,它们的 IBOutlets 从故事板连接,但始终为 nil,这导致我试图弄乱被测系统的初始化方式。
我还发现使用 [self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
的结果不一,因为有时我仍然需要调用 view
或 viewDidLoad
才能正确初始化。所以我完全取消了它,只是调用 view
,它似乎工作正常。
然而,尽管我进行了上述更改,但我的电池仍然没有插座。在互联网上翻找了一下后,我发现,你应该只使用 [self.tableView registerClass:[MyTableViewCell class]forCellReuseIdentifier:@"MytableViewcell"];
如果它还没有在故事板中创建为原型单元格。 看起来它已经为您做这件事并尝试再次做这件事会破坏 IBOutlets
。
另一个小发现是试图通过这样设置来测试我的 UIViewController
MyViewController *SUT = [MyViewController new];
[SUT view];
现在虽然初始化了,但似乎又缺少了一些步骤,因为这个 class 存在于情节提要中,因此我推荐以下内容
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SUT = [storyboard instantiateViewControllerWithIdentifier:@"My Table VC"];
[SUT view];