欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在 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 進行測試?

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

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

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

測試的代碼如下:

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 的方式。

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

相關文章

  • R.swift的使用與安裝教程

    R.swift的使用與安裝教程

    這篇文章主要給大家介紹了關于R.swift使用與安裝的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Swift網(wǎng)絡請求庫Alamofire使用詳解

    Swift網(wǎng)絡請求庫Alamofire使用詳解

    這篇文章主要為大家詳細介紹了Swift網(wǎng)絡請求庫Alamofire的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Swift Set集合及常用方法詳解總結

    Swift Set集合及常用方法詳解總結

    Set集合為集類型,集是最簡單的一種集合,存放于集中的對象不按特定方式排序,只是簡單地把對象加入集合中,類似于向口袋里放東西,對集中存在的對象的訪問和操作是通過對象的引用進行的,因此在集中不能存放重復對象
    2021-11-11
  • Swift編程中的一些類型轉換方法詳解

    Swift編程中的一些類型轉換方法詳解

    這篇文章主要介紹了Swift編程中的一些類型轉換方法詳解,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • 如何使用Swift來實現(xiàn)一個命令行工具的方法

    如何使用Swift來實現(xiàn)一個命令行工具的方法

    這篇文章主要介紹了如何使用Swift來實現(xiàn)一個命令行工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼

    通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼

    這篇文章主要給大家介紹了通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • 解析Swift中的泛型支持與使用

    解析Swift中的泛型支持與使用

    支持泛型意味著可以在規(guī)定參數(shù)類型的情況下更靈活地編寫程序,也是Swift語言先進而又強大的體現(xiàn),這里我們就來解析Swift中的泛型支持與使用:
    2016-07-07
  • iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題詳解

    iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題詳解

    UICollectionView是iOS中比較常見的一個控件,這篇文章主要給大家介紹了關于iOS Swift UICollectionView橫向分頁滾動,cell左右排版問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨小編來一起學習學習吧。
    2017-12-12
  • Swift 4.2使用self做為變量名淺析

    Swift 4.2使用self做為變量名淺析

    這篇文章主要給大家介紹了關于Swift 4.2使用self做為變量名的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Swift實現(xiàn)倒計時5秒功能

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

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

最新評論