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

首頁(yè) > 編程 > Swift > 正文

在 Swift 中測(cè)試 UIAlertController的方法

2020-03-09 17:50:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了在 Swift 中測(cè)試 UIAlertController的方法的,需要的朋友可以參考下
 

最近我讀了一篇在 Objective-C 中使用 control swizzling 測(cè)試 UIAlertController 的 文章 。這樣的文章總是促使我尋找一種不使用 control swizzling 也可以測(cè)試同樣?xùn)|西的方法。雖然,我知道 swizzling 是開發(fā)者的一個(gè)非常有力的工具,但我個(gè)人是盡可能去避免去使用它的。事實(shí)上,在最近的六年時(shí)間里,我只在一個(gè)應(yīng)用上用了 swizzling。所以我相信我們現(xiàn)在可以不使用 swizzling 來(lái)實(shí)現(xiàn)測(cè)試。

那么問題來(lái)了,如何在 Swift 中不使用 swizzling 來(lái)對(duì) UIAlertController 進(jìn)行測(cè)試?

我們先從我們要測(cè)試的代碼開始吧。我已經(jīng)添加一個(gè)按鈕到 Storyboard 中。(我之所以使用 Storyboard 為了讓那些不想用代碼寫界面的小伙伴有個(gè)更直觀的感受)當(dāng)按下這個(gè)按鈕就會(huì)出現(xiàn)一個(gè)彈窗(alert),它有標(biāo)題、消息內(nèi)容,還有兩個(gè)按鈕,分別是 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) }}

注意,在這個(gè)例子中彈窗動(dòng)作沒有做什么具體的操作,他們只表示能驗(yàn)證單元測(cè)試。

讓我們開始一個(gè)簡(jiǎn)單的測(cè)試:測(cè)試這個(gè)彈窗控制器的標(biāo)題和消息內(nèi)容。

測(cè)試的代碼如下:

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() }}```

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

添加 UIAlertController 測(cè)試標(biāo)題的代碼如下:

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

這很簡(jiǎn)單。現(xiàn)在讓我們測(cè)試 UIAlertController 的取消按鈕。這里有一個(gè)問題:無(wú)法獲取彈窗動(dòng)作的閉包。因此我們需要模擬彈窗動(dòng)作,為了存儲(chǔ)這個(gè) handler 并在測(cè)試中調(diào)用它,看彈窗動(dòng)作是否和我們預(yù)期的一樣。在測(cè)試用例中添加這樣一個(gè)類:

```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() }}

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

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) }}```

我們添加了一個(gè)類變量`Action`,并設(shè)置為`UIAlertAction.self`。這個(gè)變量我們會(huì)在初始化彈窗動(dòng)作時(shí)使用。這就能讓我們?cè)跍y(cè)試時(shí)可以重寫它。像這樣:

```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")}

首先我們插入了這個(gè)彈窗動(dòng)作。之后我們調(diào)用代碼彈出彈窗視圖控制器。我們從呈現(xiàn)的視圖控制器中獲取了取消動(dòng)作,并且成功調(diào)用了捕獲的 handler 塊。最后一步就是去斷言當(dāng)前的動(dòng)作是否和我們預(yù)期的一樣。

就是這樣,一種很簡(jiǎn)單的又不使用 swizzling 來(lái)測(cè)試 UIAlertViewController 的方式。

以上內(nèi)容是關(guān)于在 Swift 中測(cè)試 UIAlertController的方法,希望對(duì)大家有用。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
懂色av一区二区三区蜜臀| 亚洲欧美小说国产图片| 国产经典中年夫妇盗摄| 亚洲精品国产suv一区88| 国产乱码一区二区三区| 综合久久十次| 日韩av电影免费在线观看| 在线观看免费国产小视频| 麻豆精品国产传媒mv男同| 五月天丁香激情| 亚洲黄色在线免费观看| 在线观看特色大片免费视频| 亚洲精品一级片| 中文字幕人妻精品一区| 欧美一区久久久| 88xx成人免费观看视频库| 国产精品久久久久999| 日韩欧美国产一区二区在线播放| 日本黄色片一级片| 国产精品扒开腿做爽爽爽男男| 亚洲伊人第一页| 久久艹国产精品| 国产性生活毛片| 国产精品一区牛牛影视| 99热在这里有精品免费| 国产又粗又长免费视频| av黄色在线观看| 久久久人成影片一区二区三区| 一本一本久久a久久精品综合小说| 99福利在线观看| 精品一区二区三区在线观看l| 亚洲国产精品yw在线观看| 国产一线二线三线在线观看| www.爱久久| 亚洲jizzjizz日本少妇| 午夜在线视频观看| www.5588.com毛片| www.四虎.com| 一本到不卡免费一区二区| 精品国偷自产在线视频99| 国产欧美一区二区视频| 国产精品视频久久| 欧美a免费在线| 9久久9毛片又大又硬又粗| 一区二区电影在线观看| 亚洲经典视频在线观看| 自拍视频第一页| 精品国产一区二区三区四区阿崩| 美女少妇一区二区| 秋霞毛片大全| 爽爽影院免费观看视频| 久久91导航| 精品国产中文字幕| www.激情网.com| 婷婷五月色综合香五月| 国产精品毛片久久久久久久久久99999999| 国产午夜一区二区| 亚洲精品一级二级三级| 青草综合视频| 亚洲国产精彩中文乱码av| 亚洲日本欧美中文幕| 四虎成人免费观看在线网址| 欧美一级视频在线观看| 久久成人麻豆午夜电影| 55夜色66夜色国产精品视频| 可以直接在线观看的av| av大片免费在线观看| 美女脱光内衣内裤视频久久网站| 国产精品系列在线播放| 精品一区二区三区三区| 99久久综合狠狠综合久久止| 特级西西444www大胆免费看| 日韩激情免费| 久久精品在线观看视频| 独立日3在线观看完整版| 久久这里都是精品| 精品国产一区二| 精品国精品国产自在久不卡| 国产精华7777777| 精品久久久久一区二区国产| 亚洲一卡二卡三卡四卡无卡久久| 亚洲国产成人91porn| 亚洲第一成人av| 欧美日韩中文字幕| 亚洲午夜精品久久久久久久久| 国产suv精品一区二区68| 天天看片激情网站| 成人激情电影在线看| 五月综合激情婷婷六月色窝| av综合在线观看| 亚洲成av人片在线观看无| 国产女女做受ⅹxx高潮| 国产综合色在线| 国产亚洲精品av| 欧美一级片在线免费观看| 日本亚洲色大成网站www久久| 日韩一二区视频| 久久久之久亚州精品露出| 欧美日韩在线观看一区二区三区| 日本午夜精品| 国产成人精品av在线| 在线观看免费一区| 成人av在线播放| 91系列在线观看| 欧美va在线观看| 国产精品伦子伦免费视频| 韩国三级av在线免费观看| 红桃av在线播放| 欧美黄色成人| 亚洲欧美日韩综合一区| 成年人免费在线视频| 亚洲日本aⅴ片在线观看香蕉| 国内精品久久久久久99蜜桃| 久久综合社区| a天堂视频在线| 久久精品卡一| 亚洲免费小视频| 午夜天堂精品久久久久| 爽死777影院| 亚洲mv在线看| 亚洲av人人澡人人爽人人夜夜| 少妇激情一区二区三区视频| 日本成人看片网址| 欧美日韩黄色影视| 欧美1区二区三区公司| 亚洲午夜无码久久久久| 九九热在线免费观看| 91国产精品成人| 日韩欧美在线1卡| 99综合99| 一本久久知道综合久久| 成人爽a毛片免费啪啪动漫| 国产成人在线免费视频| 91麻豆精品国产91久久久资源速度| 好想男人揉我下面好多水| 日韩在线影视| 裸体av在线| gogogo免费视频观看亚洲一| 美女视频第一区二区三区免费观看网站| 日本网站在线免费观看| 亚洲专区在线| 色综合蜜月久久综合网| 色吊丝一区二区| 醉酒壮男gay强迫野外xx| 久久久久久99| 久久成人综合视频| 欧美**字幕| 欧美日韩国产精品专区| 在线观看国产福利视频| 日本国产高清不卡| 欧美大肥婆大肥bbbbb| 久久久影院官网| 午夜精品无码一区二区三区| 福利在线一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| av一级亚洲| 亚洲v日本v欧美v久久精品| 亚洲人成毛片在线播放| 国产又爽又黄无码无遮挡在线观看| 日本老熟俱乐部h0930| 天天干,天天干| 黄色av网址在线| 岛国片在线免费观看| 妞干网在线视频| 亚洲成av人片一区二区密柚| 国产精品福利电影| 久久爱www久久做| 亚洲国产精品国自产拍久久| 久久久伊人日本| 亚洲精品一区二区三区影院| 一区二区三区视频免费视频观看网站| 欧美一区二区三区日韩视频| 2025韩国大尺度电影| 欧美a一区二区| 免费久久99精品国产自| 91成人精品观看| 亚洲人成五月天| 美女不穿衣服的网站| 青草视频在线观看视频| 成人97人人超碰人人99| 91免费精品国偷自产在线| 色综合久久五月| 国产精品videossex久久发布| 亚洲天堂久久av| 伊人久久一区二区三区| 国产精品污www在线观看| 成人国产精品免费观看视频| 欧美18视频| 国产成人在线视频| 精品夜夜嗨av一区二区三区| 精品高清视频| 国产黄色影视| 国产成人久久婷婷精品流白浆| 国产精品福利在线播放| 天堂a√在线| 白嫩少妇丰满一区二区| 日韩在线一区二区三区免费视频| 亚洲网站在线播放| 五月激情婷婷在线| 欧美成人三级伦在线观看| 日韩欧美一二三四区| 国产肥白大熟妇bbbb视频| 国产经典一区二区| 成人h动漫免费观看网站| 国产成人久久精品77777最新版本| 黄色在线网站噜噜噜| 国产成人精品一区二区在线小狼| 国产成人在线色| 亚洲视频一二三| av一区二区三区在线观看| 在线免费观看成人网| 国产美女在线一区二区三区| 2019亚洲男人天堂| 欧美成人午夜影院| 欧美日韩国产一区二区三区地区| 国产视频123区| 在线观看小视频| 欧美一区免费观看| 久久久久久有精品国产| 国产视频一视频二| 岛国在线视频| 亚洲jjzzjjzz在线观看| 欧美精品一区二区三区一线天视频| 国产无套精品一区二区三区| 免费观看成人在线| 日本不卡一区二区三区四区| 超级污的网站| 综合另类专区| 女~淫辱の触手3d动漫| 欧美一级二级三级九九九| 男人久久天堂| 视频小说一区二区| 神马午夜在线观看| 亚洲AV无码精品国产| 精品国产乱码久久久久久图片| 欧美jizz18性欧美| 羞羞的视频免费| 精品欧美国产一区二区三区| 成人国产一区二区| 猫咪在线永久网站| 五月天精品在线| 国产在线播放一区三区四| 久久青青草原亚洲av无码麻豆| 91污色多多| 激情综合丝袜美女一区二区| 亚洲调教一区| 四虎网站在线观看| 国产精品成人一区二区三区| yourporn在线观看视频| 五月天婷婷在线视频| 色欧美日韩亚洲| www在线视频观看| 这里只有视频精品| 蜜桃视频无码区在线观看| 国产精品成人午夜| 成人免费网站在线观看视频| 亚洲精品一线二线三线无人区| 欧美肉大捧一进一出免费视频| 国产一区啦啦啦在线观看| 欧洲精品在线一区| 亚欧激情乱码久久久久久久久| 青春草在线视频| 亚洲视频免费观看| 中文字幕男人天堂| 男女啪啪网站视频| 黄色电影免费在线观看| 男女下面一进一出无遮挡| 国精产品一区一区三区mba视频| 91久久在线| chinese少妇国语对白| 成人观看免费完整观看| 国产电影精品久久禁18| 欧美中文在线| 国产伦精品一区二区三区在线| 精品综合久久| 日韩三级在线观看视频| 欧美日韩成人免费| 一区二区成人在线| 欧美三片在线视频观看| 成人午夜视频网站| 第一页在线视频| 欧美图片欧美激情欧美精品| 一区二区三区毛片免费| 在线观看精品国产视频| 亚洲黄色小说在线观看| 欧美性感一类影片在线播放| 日本动漫理论片在线观看网站| 国产精品一区二区无线| 在线精品视频免费观看| 中文字幕亚洲视频| 东方伊人免费在线观看| 欧美精品日韩综合在线| 欧美热在线视频精品999| 男人天堂亚洲二区| 成人影院在线| 国产成人精品一区二区无码呦| 国产无套粉嫩白浆在线2022年| 日本午夜精品一区二区三区| 国产视频网址在线| 久久久久久久欧美精品| 精品在线播放| 国产精品毛片一区二区三区四区| 日韩熟女一区二区| 久久久久久久久久国产精品| 91蜜臀精品国产自偷在线| 欧美一级做性受免费大片免费| 九九热爱视频精品视频高清| 国产不卡在线观看| 欧美bbbbxxxx| 欧美天堂在线| 日本少妇做爰全过程毛片| 久久久久久9| av网在线观看| 欧美在线播放视频| 91丨九色丨蝌蚪丨对白| eeuss鲁片一区二区三区| 欧美不卡一区二区| 天天操 夜夜操| 亚洲影院一区二区三区| 国产成人在线免费看| 91久久精品www人人做人人爽| 夜夜揉揉日日人人青青一国产精品| 激情久久一区二区| 欧美日韩国产成人在线91| 亚洲第一精品在线| 国产免费视频| 欧美日韩午夜在线视频| 久久国产视频网|