iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
Mobile Development

在 iOS 專案上加上 Unit testing - 因為 You need testing系列 第 24

D24 - 在 iOS 專案加上測試-You need testing {在 Test 啟動階段,換上測試用的 AppDelegate 適用於 UIKit 專案}

  • 分享至 

  • xImage
  •  

啟動 Unit Test 的時候,到底發生了什麼事情?

當每一次跑測試的時候,在 mac 上的 Xcode 大概都做了這些事情

1 - 啟動 macOS 上的模擬器

2 - 動態注入 test bundle 去 app

3 - 啟動模擬器上的 app

4 - 開始跑 test

5 - 終止 app

在上述第三步的時候,如果你的 App 有使用 CoreData (SwiftData),有使用追蹤服務,也有可能打了一些 api 在啟動的時候。

我們逐項來看

  • 關於 CoreData or SwiftData,這是有可能干擾 test cases ,或是有可能造成你在跑非 test 環境時,干擾你的開發或 debug 流程
  • 關於追蹤服務,現在主流的追蹤服務基本都能給你不同的參數,防止 debug 環境干擾 release 數據。雖不影響,但 unit testing 仍不應干擾數據。
  • 關於在進入第一個 screen 前打的 api,當然應該避免,因為 Unit testing 應遵守 FIRE 原則。

繞過 AppDelegate 的方法 - 適用於 UIKit 的專案

因前面的專案是使用 SwiftUI 開的,所以我們另開一個 UIKit 的專案來進行。

step1: 開一個新的檔案,這裡用 MockAppDelegate.swift 當範例

step2: 將 AppDelegate 的程式碼複製到 MockAppDelegate 裡

step3: 移除 @UIApplicationMain 或 @main

step4: 將複製過去的程式碼,class 宣告改成 MockAppDelegate

/// MockAppDelegate.swift
import UIKit

class MockAppDelegate: UIResponder, UIApplicationDelegate {

step5: 在 class name 上加上 @objc(MockAppDelegate)

step6: 將 didFinishLaunchingWithOptions 以外的 func 都移除掉

@objc(MockAppDelegate)
class MockAppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        /// 用來確認真的從 MockAppDelegate 啟動
        print("this is test target")
        return true
    }
}

step7: 開一個 main.swift 的檔案

step8: 將這段貼上 main.swift

import UIKit

let appDelegateClass: AnyClass = NSClassFromString("MockAppDelegate") ?? AppDelegate.self

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(appDelegateClass))

step9: 跑一遍 Unit Testing,你會從 console 看到 this is test target,就表示運行的是 MockAppDelegate,而不是 AppDelegate

https://ithelp.ithome.com.tw/upload/images/20231005/20140622QRABQiYToR.png


上一篇
D23 - 在 iOS 專案加上測試-You need testing {handling JSON decode error}
下一篇
D25 - 在 iOS 專案加上測試-You need testing {測試 SwiftUI 的 View}
系列文
在 iOS 專案上加上 Unit testing - 因為 You need testing32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言