Ios 在Swift中测试pushview控制器
我尝试设置路由器,以便导航到正确的Viewcontroller。当我在模拟器中调用它时,它确实工作得很好 但是:当我试图通过NavigationController的topViewController或presentedViewController属性测试此转换的结果时,我总是得到每个Viewcontroller,但不是正确的 我的方法如下所示:Ios 在Swift中测试pushview控制器,ios,swift,unit-testing,uinavigationcontroller,xctest,Ios,Swift,Unit Testing,Uinavigationcontroller,Xctest,我尝试设置路由器,以便导航到正确的Viewcontroller。当我在模拟器中调用它时,它确实工作得很好 但是:当我试图通过NavigationController的topViewController或presentedViewController属性测试此转换的结果时,我总是得到每个Viewcontroller,但不是正确的 我的方法如下所示: func navigateToViewController(_ viewController: UIViewController, animated:
func navigateToViewController(_ viewController: UIViewController, animated: Bool) {
self.pushViewController(viewController, animated: animated)
}
正如我所说。它在模拟器中工作得非常好,但我想测试一下。每次调用此选项时,都会正确设置ViewController。但是测试的结果是一个完全不同的控制器
当我断言topViewController或presentedViewController应该是HomeViewController时,我总是得到一个不同的ViewController作为结果
XCTAssertTrue(self.sut.topViewController is HomeViewController,
"The TopViewController should be set to the HomeViewController but instead: \(self.sut.topViewController)")
这是怎么回事?我该如何解决这个问题?试试这段代码,它将帮助您获得导航控制器的视图控制器堆栈中每个视图控制器的类名
for VC in (self.navigationController?.viewControllers)! {
print(VC.classForCoder)
}
因为我不确定您的代码中还有哪些可能将某些视图控制器添加到导航控制器的视图控制器堆栈中的内容更新了答案:
for VC in (self.navigationController?.viewControllers)! {
print(VC.classForCoder)
}
使用
原始答复:
对调用performsgue
的效果进行单元测试似乎不是一个好方法。我们可以做的是记录它是如何被调用的。在测试代码中,添加以下内容:
fileprivate var performSegueIdentifiers: [String] = []
extension ViewController {
override open func performSegue(withIdentifier identifier: String, sender: Any?) {
performSegueIdentifiers.append(identifier)
}
}
这将更改ViewController的性能模式
。我们没有实际执行segue,而是将标识符附加到performsgueidentifiers
中。由于这是文件范围,我们需要小心不要让它“泄漏”到其他测试中。因此,请在设置中重置它:
override func setUp() {
super.setUp()
performSegueIdentifiers = []
// other set-up
}
现在,您的测试可以调用此数组的测试内容来确定:
- 调用
performsgue
的次数
- 传递给它的序列标识符是什么
我们可以相信实际的performsgue
是有效的。我们需要测试的只是生产代码是否正确调用了它。我这样做了,但控制器没有显示在那里。您想要单元测试还是UI测试?它应该是我路由器的单元测试。因此,所有内容都是正确的,包括显示的ViewController。看起来您的类是NavigationController的子类或扩展。你能多分享一下它的界面吗?不。控制器的实例是相同的。这就是为什么我不明白为什么它不起作用。在NavigationViewController中,它只不过是一个基于字符串的开关,用于准备ViewController,它将被传递给“navigateToViewController”方法。希望有人能帮我解决这个问题。谢谢乔恩的回复。我明天早上直接试试这个。到目前为止听起来不错。非常感谢你的帮助。我很感激,乔恩,你是我的英雄。它就像一个符咒。我现在可以看到执行了什么segue,并可以检查这一点。谢谢。