最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在 Swift 中測試 UIAlertController的方法

 更新時間:2015年10月12日 12:02:09   投稿:mrr  
這篇文章主要介紹了在 Swift 中測試 UIAlertController的方法的,需要的朋友可以參考下

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

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

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

下面是這段代碼:

import UIKit
class 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 TestingAlertExperiment
class 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 測試標題的代碼如下:

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

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

```Swift
class 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(xiàn)在我們需要將這個模擬的類插入到實現(xiàn)代碼中。將視圖控制器中的代碼換成下面這個:

import UIKit
class 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`。這個變量我們會在初始化彈窗動作時使用。這就能讓我們在測試時可以重寫它。像這樣:

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

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

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

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

相關文章

  • IOS 實現(xiàn)簡單的彈幕功能

    IOS 實現(xiàn)簡單的彈幕功能

    本文主要介紹IOS 實現(xiàn)彈幕功能,這里給大家一個實例來展現(xiàn)彈幕功能,有需要的小伙伴可以參考下
    2016-07-07
  • Swift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下
    2021-11-11
  • Swift進階教程Mirror反射示例詳解

    Swift進階教程Mirror反射示例詳解

    這篇文章主要為大家介紹了Swift進階教程Mirror反射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Swift 3.0基礎學習之枚舉類型

    Swift 3.0基礎學習之枚舉類型

    枚舉在編程中很多時候要用到,在 Swift 中,枚舉具有更多的特性。下面這篇文章主要介紹了Swift 3.0基礎學習之枚舉類型的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Swift實現(xiàn)倒計時5秒功能

    Swift實現(xiàn)倒計時5秒功能

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)倒計時5秒功能,在“登錄”和“注冊”頁面也有相似功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Swift hello world!Swift快速入門教程

    Swift hello world!Swift快速入門教程

    這篇文章主要介紹了Swift hello world!Swift快速入門教程,本文在快速了解Swift編程語言,需要的朋友可以參考下
    2014-07-07
  • Swift中優(yōu)雅處理閉包導致的循環(huán)引用詳解

    Swift中優(yōu)雅處理閉包導致的循環(huán)引用詳解

    這篇文章主要給大家介紹了關于Swift中優(yōu)雅的處理閉包導致的循環(huán)引用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Swift具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Swift 中如何使用 Option Pattern 改善可選項的 API 設計

    Swift 中如何使用 Option Pattern 改善可選項的 API 設計

    這篇文章主要介紹了Swift 中如何使用 Option Pattern 改善可選項的 API 設計,幫助大家更好的進行ios開發(fā),感興趣的朋友可以了解下
    2020-10-10
  • Swift3遷移至Swift4可能遇到的問題小結

    Swift3遷移至Swift4可能遇到的問題小結

    每當看到新的編程語言我總是會有相當大的興趣,所以下面這篇文章主要給大家介紹了關于Swift3遷移至Swift4可能遇到的問題,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起學習學習吧
    2018-06-06
  • Swift使用enum抹平數(shù)組元素差異實例詳解

    Swift使用enum抹平數(shù)組元素差異實例詳解

    這篇文章主要為大家介紹了Swift使用enum抹平數(shù)組元素差異實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

多伦县| 固阳县| 丰宁| 麻阳| 德格县| 西吉县| 汉源县| 荣成市| 色达县| 德格县| 周宁县| 东安县| 富民县| 牙克石市| 泰兴市| 肥西县| 永仁县| 务川| 扬中市| 揭西县| 板桥市| 柏乡县| 吉安县| 绥化市| 明溪县| 孟村| 屏边| 民丰县| 淳化县| 五华县| 沙田区| 广宁县| 洛扎县| 胶南市| 建始县| 威远县| 永年县| 山东省| 武乡县| 滦南县| 佛学|