使用Quick & Nimble测试Coordinator时遇后台线程布局错误求助
解决Coordinator测试中的后台线程布局修改错误
这个错误的核心原因是:UIKit的所有布局、视图操作必须在主线程执行,而Quick框架的测试代码默认可能在后台线程运行,当你的MainCoordinator.start()方法内部执行了push视图控制器这类UI操作时,就会触发该报错。
解决方案
1. 单独将Coordinator启动操作放到主线程
修改测试代码中describe("#start")块内的beforeEach逻辑,把sut.start()包裹在主线程同步调用里:
describe("#start") { beforeEach { DispatchQueue.main.sync { sut.start() } } it("pushes HomeViewController") { expect(sut.currentViewController).to(beAKindOf(HomeViewController.self)) } }
使用sync可以确保UI操作完成后再执行后续的断言逻辑,避免异步导致的断言失效。
2. 全局配置所有测试用例在主线程运行
如果你的项目中有多个测试类都存在类似跨线程UI操作问题,可以在测试类的spec()方法开头添加全局配置,让所有测试用例默认在主线程启动:
override func spec() { beforeSuite { QuickConfiguration.current.configuration.beginOnMainThread = true } var sut: MainCoordinator! var navigationControllerMock: UINavigationControllerMock! var viewControllerMock: ViewControllerMock! beforeEach { navigationControllerMock = UINavigationControllerMock() viewControllerMock = ViewControllerMock() sut = MainCoordinator(navigationController: navigationControllerMock, flow: .firstFlow) UIView.setAnimationsEnabled(false) } // 剩余测试代码... }
验证
修改后,MainCoordinator.start()中的UI操作会强制在主线程执行,不会再触发"Modifications to the layout engine must not be performed from a background thread"的错误,同时断言可以正常验证当前视图控制器的类型。
内容的提问来源于stack exchange,提问作者Yuri Cavalcanti
相关产品推荐
相关产品推荐

