亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

在 Swift 中測試 UIAlertController的方法

2020-03-09 17:50:04
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在 Swift 中測試 UIAlertController的方法的,需要的朋友可以參考下
 

最近我讀了一篇在 Objective-C 中使用 control swizzling 測試 UIAlertController 的 文章 。這樣的文章總是促使我尋找一種不使用 control swizzling 也可以測試同樣東西的方法。雖然,我知道 swizzling 是開發者的一個非常有力的工具,但我個人是盡可能去避免去使用它的。事實上,在最近的六年時間里,我只在一個應用上用了 swizzling。所以我相信我們現在可以不使用 swizzling 來實現測試。

那么問題來了,如何在 Swift 中不使用 swizzling 來對 UIAlertController 進行測試?

我們先從我們要測試的代碼開始吧。我已經添加一個按鈕到 Storyboard 中。(我之所以使用 Storyboard 為了讓那些不想用代碼寫界面的小伙伴有個更直觀的感受)當按下這個按鈕就會出現一個彈窗(alert),它有標題、消息內容,還有兩個按鈕,分別是 OK 和取消(Cancel)。

下面是這段代碼:

import UIKitclass ViewController: UIViewController { var actionString: String? @IBAction func showAlert(sender: UIButton) {  let alertViewController = UIAlertController(title: "Test Title", message: "Message", preferredStyle: .Alert)  let okAction = UIAlertAction(title: "OK", style: .Default) { (action) -> Void in   self.actionString = "OK"  }  let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) -> Void in   self.actionString = "Cancel"  }  alertViewController.addAction(cancelAction)  alertViewController.addAction(okAction)  presentViewController(alertViewController, animated: true, completion: nil) }}

注意,在這個例子中彈窗動作沒有做什么具體的操作,他們只表示能驗證單元測試。

讓我們開始一個簡單的測試:測試這個彈窗控制器的標題和消息內容。

測試的代碼如下:

import XCTest@testable import TestingAlertExperimentclass TestingAlertExperimentTests: XCTestCase { var sut: ViewController! override func setUp() {  super.setUp()  sut = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController  UIApplication.sharedApplication().keyWindow?.rootViewController = sut } override func tearDown() {  // Put teardown code here. This method is called after the invocation of each test method in the class.  super.tearDown() }}```

我們需要設置 sut 為根視圖控制器,否則視圖控制器不能彈出這個彈窗視圖控制器。

添加 UIAlertController 測試標題的代碼如下:

```Swiftfunc testAlert_HasTitle() { sut.showAlert(UIButton()) XCTAssertTrue(sut.presentedViewController is UIAlertController) XCTAssertEqual(sut.presentedViewController?.title, "Test Title")}``` 

這很簡單?,F在讓我們測試 UIAlertController 的取消按鈕。這里有一個問題:無法獲取彈窗動作的閉包。因此我們需要模擬彈窗動作,為了存儲這個 handler 并在測試中調用它,看彈窗動作是否和我們預期的一樣。在測試用例中添加這樣一個類:

```Swiftclass MockAlertAction : UIAlertAction { typealias Handler = ((UIAlertAction) -> Void) var handler: Handler? var mockTitle: String? var mockStyle: UIAlertActionStyle convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)?) {  self.init()  mockTitle = title  mockStyle = style  self.handler = handler } override init() {  mockStyle = .Default  super.init() }}

這個模擬類的主要工作是捕獲 handler 塊,以備后用?,F在我們需要將這個模擬的類插入到實現代碼中。將視圖控制器中的代碼換成下面這個:

import UIKitclass ViewController: UIViewController { var Action = UIAlertAction.self var actionString: String? @IBAction func showAlert(sender: UIButton) {  let alertViewController = UIAlertController(title: "Test Title", message: "Message", preferredStyle: .Alert)  let okAction = Action.init(title: "OK", style: .Default) { (action) -> Void in   self.actionString = "OK"  }  let cancelAction = Action.init(title: "Cancel", style: .Cancel) { (action) -> Void in   self.actionString = "Cancel"  }  alertViewController.addAction(cancelAction)  alertViewController.addAction(okAction)  presentViewController(alertViewController, animated: true, completion: nil) }}```

我們添加了一個類變量`Action`,并設置為`UIAlertAction.self`。這個變量我們會在初始化彈窗動作時使用。這就能讓我們在測試時可以重寫它。像這樣:

```Swiftfunc testAlert_FirstActionStoresCancel() { sut.Action = MockAlertAction.self sut.showAlert(UIButton()) let alertController = sut.presentedViewController as! UIAlertController let action = alertController.actions.first as! MockAlertAction action.handler!(action) XCTAssertEqual(sut.actionString, "Cancel")}

首先我們插入了這個彈窗動作。之后我們調用代碼彈出彈窗視圖控制器。我們從呈現的視圖控制器中獲取了取消動作,并且成功調用了捕獲的 handler 塊。最后一步就是去斷言當前的動作是否和我們預期的一樣。

就是這樣,一種很簡單的又不使用 swizzling 來測試 UIAlertViewController 的方式。

以上內容是關于在 Swift 中測試 UIAlertController的方法,希望對大家有用。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性色av一区二区三区免费| 91九色国产社区在线观看| 91国产视频在线播放| 成人午夜在线影院| 国产丝袜精品第一页| 久久福利视频导航| 欧美精品少妇videofree| 九九热r在线视频精品| 欧美裸体xxxx极品少妇软件| 国产精品午夜国产小视频| 国产精品爽黄69| 日韩中文字幕网站| 欧美在线观看一区二区三区| 久久久免费观看视频| 国产精品视频成人| 亚洲视频一区二区| 尤物九九久久国产精品的分类| 成人春色激情网| 欧美精品激情blacked18| 91最新在线免费观看| 伊人成人开心激情综合网| 国内精品久久影院| 久久免费视频这里只有精品| 国产婷婷97碰碰久久人人蜜臀| 中文字幕在线日韩| 久久久久国产精品免费| 欧美国产日韩精品| 九九热视频这里只有精品| 成人精品福利视频| 国产91精品高潮白浆喷水| 亚洲一品av免费观看| 亚洲资源在线看| 久久精品色欧美aⅴ一区二区| 国产精品视频久久| 亚洲欧美日韩久久久久久| 欧美—级a级欧美特级ar全黄| 亚洲在线第一页| 久久综合免费视频| 日韩欧美aⅴ综合网站发布| 久久中文久久字幕| 国产精品国产三级国产aⅴ浪潮| 久久精品国产久精国产思思| 国产成人亚洲综合91| 国产精品69久久| 欧美高清在线观看| 欧美视频第一页| 国产午夜精品视频免费不卡69堂| 精品国产一区二区三区久久久| 久久免费国产精品1| 久久久久久久久国产| 亚洲人成电影在线| 92看片淫黄大片欧美看国产片| 国内精品久久久久影院 日本资源| 精品免费在线视频| 一区二区三区四区精品| 欧美日韩高清在线观看| 亚洲免费视频一区二区| 97精品视频在线观看| 欧美性猛交丰臀xxxxx网站| 欧美精品免费播放| 精品国产依人香蕉在线精品| 国产a∨精品一区二区三区不卡| 亚州国产精品久久久| 久久成年人免费电影| 成人网址在线观看| 亚洲午夜色婷婷在线| 亚洲国产古装精品网站| 18性欧美xxxⅹ性满足| 国产亚洲精品久久久| 欧美成人在线影院| 亚洲精品国精品久久99热| 亚洲欧美日韩精品久久| 亚洲电影免费在线观看| 久久国产精品亚洲| 日韩av大片在线| 在线国产精品播放| 国产成人中文字幕| 国产精品xxx视频| 精品二区三区线观看| 欧洲成人在线观看| 久久久久久com| 国产精品成人aaaaa网站| 欧美日韩另类视频| 国产福利精品av综合导导航| 国产亚洲美女久久| 97婷婷大伊香蕉精品视频| 国外成人在线直播| 亚洲第一二三四五区| 亚洲欧美中文字幕| 久久久国产在线视频| 欧美精品日韩www.p站| 蜜臀久久99精品久久久久久宅男| 97人人做人人爱| 最近2019中文字幕第三页视频| 岛国av午夜精品| 欧美丰满少妇xxxx| 欧美日韩国产在线| 日韩中文有码在线视频| 国产一区二区三区精品久久久| 久久69精品久久久久久久电影好| 久久亚洲精品国产亚洲老地址| 欧美在线视频一区| 国产精品免费视频久久久| 色综合天天综合网国产成人网| 国产欧美在线观看| 久久精视频免费在线久久完整在线看| 国产成人免费91av在线| 国产精品wwww| 亚洲精品suv精品一区二区| 欧美精品生活片| 久久精品青青大伊人av| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产成人一区| 在线视频欧美日韩精品| 一区二区三区高清国产| 欧美第一黄网免费网站| 91欧美精品成人综合在线观看| 日韩视频免费看| 在线日韩中文字幕| 欧美综合激情网| 日av在线播放中文不卡| 黑人狂躁日本妞一区二区三区| 久久天天躁狠狠躁夜夜av| 亚洲欧洲午夜一线一品| 日本韩国在线不卡| 日韩中文字幕在线播放| 精品久久久久久久大神国产| 精品久久久久人成| 91精品国产91| 国产成人精品在线观看| 亚洲视频在线免费观看| 伊人久久综合97精品| 精品国产一区二区三区久久狼黑人| 欧美激情欧美激情在线五月| 亚洲曰本av电影| 黑人巨大精品欧美一区二区三区| 亚洲激情久久久| 亚洲精品白浆高清久久久久久| 欧美激情精品久久久久久久变态| 亚洲人成网站999久久久综合| 日韩精品久久久久久福利| 91精品久久久久久综合乱菊| 久久亚洲精品毛片| 国产精品自产拍在线观| 精品日本高清在线播放| 2025国产精品视频| 91香蕉亚洲精品| 国产精品久久9| 色综合伊人色综合网站| 亚洲电影成人av99爱色| 欧美丝袜一区二区三区| 精品亚洲一区二区三区在线观看| 国产在线播放不卡| 国产精品日日做人人爱| 亚洲伊人一本大道中文字幕| 日韩黄色在线免费观看| 日韩免费电影在线观看| 国产精品精品久久久| 少妇精69xxtheporn| 日韩免费观看高清| 日韩国产在线看| 精品日韩中文字幕| 亚洲乱码一区二区| 欧美性xxxxxx|