我正在我的一个UIViewController上测试viewDidLoad事件。
- (void)testMyView
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:MYID];
[vc viewDidLoad];
STAssertNotNil(vc, @"MyViewController should not be nil");
}
如果我删除了行[vc viewDidLoad];
,则永远不会触发viewDidLoad
。
如果我让[vc viewDidLoad];
到位,viewDidLoad
会被触发两次。
我理解视图是延迟加载的,但我怎样才能避免这种行为?
是否有关于View测试的最佳实践?
答案 0 :(得分:10)
您需要访问该视图才能自动加载。
你可以使用这样的东西来做到这一点而没有副作用:
vc.view.hidden = NO; // Or YES if it is supposed to be hidden.
哦,然后删除您对viewDidLoad
的手动调用,因为它不需要。
答案 1 :(得分:1)
阅读我的评论https://github.com/onmyway133/blog/issues/52
假设我们有以下视图控制器
class ListController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
了解viewDidLoad
我们知道第一次创建视图时会调用viewDidLoad。因此,在单元测试中,如果使用viewDidLoad触发,则会陷入陷阱
func testSetup() {
let controller = ListController()
controller.viewDidLoad()
}
为什么viewDidLoad被调用两次?
在测试中调用一次 在viewDidLoad方法中,您访问第一次创建的视图,因此它将再次触发viewDidLoad
正确方法
最佳做法不是自己触发事件,而是做一些让事件发生的事情。在单元测试中,我们只访问视图以触发viewDidLoad
func testSetup() {
let controller = ListController()
let _ = controller.view
}
答案 2 :(得分:0)
使用[vc view];
进行延迟加载答案 3 :(得分:0)
在视图控制器的视图上调用layoutIfNeeded()
,即:
[vc.view layoutIfNeeded]
答案 4 :(得分:0)
您只能使用以下调用执行一次viewDidLoad:
_ = vc.view