UIalertControllerテストの修正
2553 ワード
作者:dom,原文链接,原文日期:2015-11-25訳者:小袋;校正:lfb_CD;下書き:千葉知風
2ヶ月前、UIAlertControllerをテストする方法を発表しました.ある読者はテストが予定通りに機能していないことに気づいた.
@dasdomあなたのテストは正常ですが、
Larhythimxの言うことは完全に正しい.シミュレータの初期化方法は呼び出されなかった.どうして私はこのテスト例を書いたときに気づかなかったのですか?それはhandlerが確かに呼び出され、
だから黄金の通路(つまり実現を変える必要のないテストを書く)として通じないなら、退いて次の方法を求めます.
まず、
この書き換え方法を
実装コードでは、クラスメソッドを使用してalertアクションを作成できます.
テスト・インスタンスが正常に動作していることを確認するために、
さらに,動作のシミュレーションタイトルにテストを追加した.アクションをキャンセルするテストは、次のようにします.
このテストは、初期化メソッドが呼び出されていないため、シミュレーションタイトルも設定されていないため、以前のバージョンでは失敗します.
githubで修正されたバージョンを見つけることができます.
Larhythimxのツイッターに改めて感謝!
本文はSwiftGG翻訳グループから翻訳して、すでに作者の翻訳の授権を得て、最新の文章は訪問して下さいhttp://swift.gg.
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)
テスト・インスタンスが正常に動作していることを確認するために、
MockAlertAction
のhandler
プロパティの名前を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.