从UnitTest启动ViewDidAppear

End*_*esh 6 tdd unit-testing ios swift swift3

在UnitTest中激活ViewDidAppear:

在回答我的问题之前,我知道有一个问题与这个问题非常类似(单元测试不会调用viewDidAppear方法),但似乎没有回答这个问题.

我想知道如何最好地激活viewDidAppear()viewController来测试该方法中应该发生的各种事情.我很确定viewDidAppear()直接打电话是不好的做法; 所以我想知道如何在测试中间接调用它.

我已经按照娜塔莎的教程https://www.natashatherobot.com/ios-testing-view-controllers-swift/进行了操作,因此发现了如何激活viewDidLoad()而无需直接调用它.在底部附近讨论了使用beginAppearanceTransition(true, animated: true)间接调用它,但这对我来说似乎没有预期的结果.

有什么建议?谢谢!

小智 13

您应首先为viewWillAppear调用beginAppearanceTransition,然后为viewDidAppear调用endAppearanceTransition.endAppearanceTransition本身不会执行viewDidAppear:

迅速

 sut.beginAppearanceTransition(true, animated: true)
 sut.endAppearanceTransition()
Run Code Online (Sandbox Code Playgroud)

目标 - C.

[self.sut beginAppearanceTransition:YES animated:NO];
[self.sut endAppearanceTransition];
Run Code Online (Sandbox Code Playgroud)

  • 从 iOS SDK 13.0 开始,我认为这不再有效(它只会触发 `viewWillAppear`) (2认同)

Dav*_*Nix 6

我认为viewDidAppear(false)直接打电话进行单元测试并不是一种糟糕的做法.我已经完成了数百次单元测试,没有任何不良影响.毕竟viewDidAppear,viewWillAppear和其他的生命周期方法是正义的.方法.

但是,我知道为单元测试设置视图层次结构很可怕.对于每个iOS版本,不确定Apple将对私有实现做出哪些改变可能会破坏您的视图控制器测试.但到目前为止,我见过的唯一警告是,有时您必须将控制器的视图添加到窗口,尤其是在测试呈现控制器时.

我还打电话loadView()viewDidLoad()直接.我通常在setup视图控制器单元测试的部分中调用这两种方法.这使我无法设置复杂的视图控制器层次结构,从而允许我将每个视图控制器作为一个单元进行测试.

另一方面,直接在生产代码中调用这些方法是不好的做法,应该避免.