日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解 RXSwift:单元测试(四)

發布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解 RXSwift:单元测试(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

理解 RxSwift:為什么要使用 RxSwift(一)

理解 RxSwift:實現原理(二)

理解 RxSwift:單元測試(四)

這篇文章是閱讀 RxSwift: Reactive Programming with Swift 時記的筆記,介紹如何使用RxTest和RxBlocking對RxSwift編寫單元測試。

書上使用RxTest和RxBlocking對一個 demo 進行了完整的單元測試和講解,在這個過程中,我們可以熟悉一下RxSwift 單元測試的使用方法,了解單元測試的一般使用技巧和注意事項。

Demo 介紹

Demo 是一個轉換顏色的小應用,根據用戶輸入的16進制顏色代碼自動轉換為紅、綠、藍色值和顏色名字(若有)。

Demo 是使用MVVM模式實現的,邏輯代碼放在了ViewModel中,ViewController管理和控制View。ViewModel的主要代碼如下:

// Convert hex text to color color = hexString.asObservable().map { hex inguard hex.characters.count == 7 else { return .clear }let color = UIColor(hex: hex)return color}.asDriver(onErrorJustReturn: .clear)// Convert the color to an rgb tuple rgb = color.asObservable().map { color invar red: CGFloat = 0.0var green: CGFloat = 0.0var blue: CGFloat = 0.0color.getRed(&red, green: &green, blue: &blue, alpha: nil)let rgb = (Int(red * 255.0), Int(green * 255.0), Int(blue * 255.0))return rgb}.asDriver(onErrorJustReturn: (0, 0, 0))// Convert the hex text to a matching name colorName = hexString.asObservable().map { hexString inlet hex = String(hexString.characters.dropFirst())if let color = ColorName(rawValue: hex) {return "\(color)"} else {return "--"}}.asDriver(onErrorJustReturn: "")復制代碼

接下來,主要針對ViewModel編寫單元測試。

編寫單元測試

首先介紹兩個RxSwift單元測試的庫,RxTest 和 RxBlocking,它們讓編寫測試用例更簡單。

RxTest 是一個獨立的庫,需要通過pod單獨安裝。RxTest提供了很多有用的功能,例如TestScheduler,它是一個虛擬時間scheduler,可以在指定時間發出事件,包括next、completed和error。

RxBlocking 也是獨立的庫,也需要通過pod安裝。它的作用是通過它的toBlocking(timeout:)方法將observable 轉換成 BlockingObservable。阻塞當前線程,從而將異步操作轉換為同步操作,使測試變得容易。

打開TestingTests組中的TestingViewModel.swift,在類的頂部定義兩個屬性:

var scheduler: ConcurrentDispatchQueueScheduler! var disposeBag: Disposable! 復制代碼

ConcurrentDispatchQueueScheduler 是并行隊列調度器,封裝了GCD的并行隊列。

setUp()方法,每個測試用例在開始前都會調用它。這里初始化一個新的 scheduler 和 viewModel。tearDown(),在每個測試完成時調用,一般執行一些銷毀操作。

func testColorIsRedWhenHexStringIsFF0000_async() {let disposeBag = DisposeBag()// 1let expect = expectation(description: #function)// 2let expectedColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha:1.0)// 3var result: UIColor! } 復制代碼

驗證異步操作是否按預期運行,我們在測試中創建期望 expectation,然后在異步操作成功后調用fulfill()方法,表示滿足期望 expectation。

  • 創建一個異步事件期望。
  • 創建 expectedColor 表示預期的測試結果。
  • 定義實際結果變量。
  • // 1 viewModel.color.asObservable().skip(1).subscribe(onNext: {// 2result = $0expect.fulfill()}).disposed(by: disposeBag) // 3 viewModel.hexString.value = "#ff0000" // 4 waitForExpectations(timeout: 1.0) { error inguard error == nil else {XCTFail(error!.localizedDescription)return}// 5XCTAssertEqual(expectedColor, result) } 復制代碼
  • 創建一個訂閱,追蹤 viewModel 的color 變化。這略過了第一個元素,因為第一個元素通常是初始化值。
  • 分配.next事件,把結果賦值給result,并在expect上調用fulfill(),表示此異步事件已完成。
  • 給viewModel的hexString賦一個新值
  • 超時1秒來等待expectation的完成,并提供error處理
  • 斷言期望的color等于實際的result。
  • 現在使用RxBlocking來實現同樣的事情:

    func testColorIsRedWhenHexStringIsFF0000() {// 1let colorObservable =viewModel.color.asObservable().subscribeOn(scheduler)// 2viewModel.hexString.value = "#ff0000"// 3do {guard let result = try colorObservable.toBlocking(timeout:1.0).first() else { return }XCTAssertEqual(result, .red)} catch {print(error)} } 復制代碼
  • 創建colorObservable來訂閱并發scheduler上的observable結果。
  • 在viewModel的hexString上賦一個新值。
  • 調用toBlocking(),并設置1秒的超時時間,如果拋出,捕獲并打印錯誤,然后斷言實際的結果與預期的匹配。
  • func testRgbIs010WhenHexStringIs00FF00() {// 1let rgbObservable =viewModel.rgb.asObservable().subscribeOn(scheduler)// 2viewModel.hexString.value = "#00ff00"// 3let result = try! rgbObservable.toBlocking().first()!XCTAssertEqual(0 * 255, result.0)XCTAssertEqual(1 * 255, result.1)XCTAssertEqual(0 * 255, result.2) } 復制代碼
  • 創建rgbObservable來訂閱viewModel的rgb值。
  • 在viewModel的hexString上賦一個新值。
  • 檢索在rgbObservable上調用toBlocking的第一個結果,然后斷言每個值與期望的相等。
  • func testColorNameIsRayWenderlichGreenWhenHexStringIs006636() {// 1let colorNameObservable =viewModel.colorName.asObservable().subscribeOn(scheduler)// 2viewModel.hexString.value = "#006636"// 3XCTAssertEqual("rayWenderlichGreen", try!colorNameObservable.toBlocking().first()!) } 復制代碼
  • 創建observable
  • 在viewModel的hexString上賦一個新值。
  • 斷言實際的結果來匹配期望的結果。
  • 轉載于:https://juejin.im/post/5d5a349e6fb9a06b0b1c752c

    總結

    以上是生活随笔為你收集整理的理解 RXSwift:单元测试(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。