2016-07-13 7 views
1

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()を使用する方法に関するガイダンスはありますか?私は間違って何をしていますか?

+1

これはおそらくあなたが聞きたかったものではありませんが、あなたがしていたことは常に間違っていました。このように、ビュー階層に余分なUIWindowをハッキングすることはありません。 - しかし、もっと助けになる:これは本当にあなたが単体テストにしたいものですか? UIテストの候補者のように聞こえます。 – matt

+0

私はこれがハッキングだとは思わない。 UIWindowsの追加が意味をなす場所については、[this post](http://stackoverflow.com/questions/8232398/advantages-problems-examples-of-adding-another-uiwindow-to-an-ios-app)を参照してください。私はこれがそれらの1つだと思う - 私たちは、このアラートを他のUI要素の上に浮かべたい。また、私の質問にリンクされているポストは、これがAppleのUIAlertControllerに関する質問の内部解決策であることを示唆しています – Julien

+0

Appleの_own_アラート(電話のようなものです)は確かに窓です。しかし、それはアプリの外です。それはあなたがそれを行うべきであるということを意味するものではなく、UIAlertControllerの仕組みではありません。あなたが好きであれば、カスタムアラートを他のUIエレメントよりも「浮かせる」ように、私はあなたに完全に通常の非ハッキーな非ウィンドウ方法を与えることができます。しかしもちろん、それは完全にあなた次第です。 – matt

答えて

0

ユニットテスト環境で動作するようにUIWindowを設定できるかどうかの問題は解決していませんが、@ mattのコメントは私には分かりますが、これはおそらく最初のユニットテストである必要はありません次の理由により、プレースメントが行われます。

  1. アラートシナリオを実行するUIテストが既に用意されています。ビルドによってアラートが表示されなくなった場合、すぐに気付くでしょう
  2. ユニットテストの残りの部分については、このメソッドをスタブして完了コールバックをただちに呼び出すことができます。
  3. 質問の当初の動機付けによれば、ユニットテストでUIWindowオブジェクトを適切に使用する方法はないようです。
関連する問題