我正在使用XCTest来测试我的视图控制器。
我必须验证我的textfield
,因此我从故事板初始化了一个视图控制器并试图访问textfiled
:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = (ViewController *)[sb instantiateViewControllerWithIdentifier:@"ViewController"];
XCTAssertNotNil(_vc.emailField, @"email field is nil!"); // fail
如果我使用模拟器手动测试此视图控制器,我可以访问emailField
并为其设置/获取值,但我无法通过我的代码访问它(_vc.emailField
为nil)。
我想知道:
从代码的角度来看,故事板中的元素何时由iOS创建。 (我猜他们会在viewDidLoad
中创建,但我在测试后发现我错了)
如何访问XCTest中的元素?
答案 0 :(得分:2)
加载视图后,xib
中的所有视图元素都可用。问题是你实际上从未真正导致加载视图。
你应该拨打viewController.view
,这将导致加载视图并连接所有出口。
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = (ViewController *)[sb instantiateViewControllerWithIdentifier:@"ViewController"];
__unused UIView *view = _vc.view; // cause the view to be loaded
XCTAssertNotNil(_vc.emailField, @"email field is nil!");
答案 1 :(得分:0)
应在viewDidLoad
中创建属性,但在viewWillAppear:
我解决此问题的方法是向视图控制器添加另一个属性以包含数据(因为视图不应该是任何存储数据的主要所有者)并将vc.emailField.text
的值设置为viewWillAppear