UIViewController
とは無関係のコードからUIAlertController
を表示する方法の参考に、following postを使用しています。今、私はこのコードのユニットテストしたい:ユニットテストを実行するときにUIWindow()によるユニットテスト
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に示す実際であることを確認しているよ以来、モックUIWindowなどを使用しないと思います。
ユニットテストでUIWindows()を使用する方法に関するガイダンスはありますか?私は間違って何をしていますか?
これはおそらくあなたが聞きたかったものではありませんが、あなたがしていたことは常に間違っていました。このように、ビュー階層に余分なUIWindowをハッキングすることはありません。 - しかし、もっと助けになる:これは本当にあなたが単体テストにしたいものですか? UIテストの候補者のように聞こえます。 – matt
私はこれがハッキングだとは思わない。 UIWindowsの追加が意味をなす場所については、[this post](http://stackoverflow.com/questions/8232398/advantages-problems-examples-of-adding-another-uiwindow-to-an-ios-app)を参照してください。私はこれがそれらの1つだと思う - 私たちは、このアラートを他のUI要素の上に浮かべたい。また、私の質問にリンクされているポストは、これがAppleのUIAlertControllerに関する質問の内部解決策であることを示唆しています – Julien
Appleの_own_アラート(電話のようなものです)は確かに窓です。しかし、それはアプリの外です。それはあなたがそれを行うべきであるということを意味するものではなく、UIAlertControllerの仕組みではありません。あなたが好きであれば、カスタムアラートを他のUIエレメントよりも「浮かせる」ように、私はあなたに完全に通常の非ハッキーな非ウィンドウ方法を与えることができます。しかしもちろん、それは完全にあなた次第です。 – matt