gpt4 book ai didi

ios - 使用 UIWindow() 进行单元测试时出现 NSInternalConsistencyException

转载 作者:可可西里 更新时间:2023-11-01 00:36:26 28 4
gpt4 key购买 nike

我一直在使用 following post作为如何从与特定 UIViewController 无关的代码中显示 UIAlertController 的指南。现在,我想对这段代码进行单元测试:

func showAlert(alert: UIAlertController, animated: Bool, completion: (()->Void)?) 
{
let alertWindow = UIWindow(frame: UIScreen.mainScreen().bounds)

// Keep a strong refence to the window.
// We manually set this to nil when the alert is dismissed
self.alertWindow = alertWindow

alertWindow.rootViewController = UIViewController()
if let currentTopWindow = UIApplication.sharedApplication().windows.last {
alertWindow.windowLevel = currentTopWindow.windowLevel + 1
}
else {
// This case only happens during unit testing
Logger.trace(ICELogLevel.Error, category: .Utility, message: "The application doesn't have a window being displayed!")
}

// preload the viewController for unit testing
// (see https://www.natashatherobot.com/ios-testing-view-controllers-swift/ )
let _ = alertWindow.rootViewController?.view
alertWindow.makeKeyAndVisible()

alertWindow.rootViewController!.presentViewController(self.alertController, animated: animated, completion: completion)
}

但是,在运行单元测试时,在 alertWindow.makeKeyAndVisible() 行上,我得到一个 NSInternalInconsistencyException: props must have a valid clientID

此代码在应用程序代码中有效,我不希望使用模拟 UIWindow 等,因为我希望验证警报是否实际显示在真实 用户界面窗口。

关于我们如何在单元测试中使用 UIWindows() 的任何指南?我做错了什么?

最佳答案

问题在于 makeKeyAndVisible 调用的代码在内部需要一个正在运行的 UIApplication 实例。这就是为什么在测试框架时抛出异常而不是在测试应用程序时抛出异常的原因。应用程序测试将测试包注入(inject)到正在运行的应用程序中。简单的解决方法是从:

alertWindow.makeKeyAndVisible()

alertWindow.isHidden = false

这有效并允许 View Controller 与窗口隔离进行测试。缺点当然是这与 makeKeyAndVisible 相同 - 它没有触发异常的副作用。

另一种策略是专门创建一个新的空应用程序目标来支持测试。将被测框架嵌入其中,并将其用作单元测试的主机应用程序。

关于ios - 使用 UIWindow() 进行单元测试时出现 NSInternalConsistencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38363421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com