UnitTests和iOs:viewDidLoad触发两次

时间:2013-06-12 17:09:36

标签: ios unit-testing

我正在我的一个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测试的最佳实践?

5 个答案:

答案 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