UIalertControllerテストの修正

2553 ワード

作者:dom,原文链接,原文日期:2015-11-25訳者:小袋;校正:lfb_CD;下書き:千葉知風
2ヶ月前、UIAlertControllerをテストする方法を発表しました.ある読者はテストが予定通りに機能していないことに気づいた.
@dasdomあなたのテストは正常ですが、MockUIActionの簡便なinitメソッドは呼び出されていません.initの方法を書き換えることはできません.iOSのバグのように見えます.—Larhythimx (@Larhythmix) 25. November 2015
Larhythimxの言うことは完全に正しい.シミュレータの初期化方法は呼び出されなかった.どうして私はこのテスト例を書いたときに気づかなかったのですか?それはhandlerが確かに呼び出され、UIAlertActionが本当にhandlerを内部変数として動作を格納するhandler閉パケットのように見えるからだ.これは非常に脆弱であり、Larhythimxは別のtweetで彼のテストプログラムでhandlerがnilであることを指摘した.
だから黄金の通路(つまり実現を変える必要のないテストを書く)として通じないなら、退いて次の方法を求めます.
まず、UIAlertActionにactionを作成するクラスメソッドを追加します.ViewController.swiftでは、次の拡張機能が追加されました.
extension UIAlertAction {
  class func makeActionWithTitle(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)?) -> UIAlertAction {
    return UIAlertAction(title: title, style: style, handler: handler)
  }
}

この書き換え方法をMockAlertActionに追加します.
override class func makeActionWithTitle(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)?) -> MockAlertAction {
  return MockAlertAction(title: title, style: style, handler: handler)
}

実装コードでは、クラスメソッドを使用してalertアクションを作成できます.
let okAction = Action.makeActionWithTitle("OK", style: .Default) { (action) -> Void in
    self.actionString = "OK"
}
let cancelAction = Action.makeActionWithTitle("Cancel", style: .Default) { (action) -> Void in
    self.actionString = "Cancel"
}
alertViewController.addAction(cancelAction)

テスト・インスタンスが正常に動作していることを確認するために、MockAlertActionhandlerプロパティの名前をmockHandlerに変更します.
var mockHandler: Handler?

さらに,動作のシミュレーションタイトルにテストを追加した.アクションをキャンセルするテストは、次のようにします.
func testAlert_FirstActionStoresCancel() {
  sut.Action = MockAlertAction.self
  
  sut.showAlert(UIButton())
  
  let alertController = sut.presentedViewController as! UIAlertController
  let action = alertController.actions.first as! MockAlertAction
  action.mockHandler!(action)
  
  XCTAssertEqual(sut.actionString, "Cancel")
  XCTAssertEqual(action.mockTitle, "Cancel")
}

このテストは、初期化メソッドが呼び出されていないため、シミュレーションタイトルも設定されていないため、以前のバージョンでは失敗します.
githubで修正されたバージョンを見つけることができます.
Larhythimxのツイッターに改めて感謝!
本文はSwiftGG翻訳グループから翻訳して、すでに作者の翻訳の授権を得て、最新の文章は訪問して下さいhttp://swift.gg.