1

我正在我的一个 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");
}

如果我删除 line [vc viewDidLoad];viewDidLoad则永远不会触发。

如果我让[vc viewDidLoad];到位,viewDidLoad则会触发两次。

我知道视图是延迟加载的,但是我怎样才能避免这种行为呢?

有没有关于 View 测试的最佳实践?

4

5 回答 5

11

您需要访问视图才能使其自动加载。

您可以使用这样的方法来做到这一点而不会产生副作用:

vc.view.hidden = NO; // Or YES if it is supposed to be hidden.

哦,然后删除您的手动调用,viewDidLoad因为它不需要。

于 2013-06-12T17:12:40.930 回答
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
}
于 2017-06-07T11:59:22.450 回答
0

使用 [vc view] 进行延迟加载;

于 2016-11-29T16:25:17.037 回答
0

您只能使用以下调用执行一次 viewDidLoad:

_ = vc.view
于 2019-11-15T15:31:07.010 回答
0

调用layoutIfNeeded()视图控制器的视图,即:

[vc.view layoutIfNeeded]
于 2017-05-09T11:34:20.717 回答