簡體   English   中英

您可以在 swift 中使用 async/await 以及測試調度程序嗎?

[英]Can you use async/await in swift along with a test scheduler?

我們在單元測試中廣泛使用Pointfree Combine Scheduler ,特別是TestScheduler

有沒有辦法在 Swift 中使用這個相同的庫或類似的測試調度程序庫以及新的異步/等待 基本上,您能否以編程方式在 async/await 生成的反應流中隨時間移動和前進?

我們為什么要這個? 正如 Pointfree 所描述的:

此調度程序可用於測試時間流如何影響使用異步運算符的發布者,例如 debounce、throttle、delay、timeout、receive(on:)、subscribe(on:) 等

Swift 似乎最近引入了Swift 異步算法,其中包括對其中許多運算符的支持。 社區如何測試這些運營商?

幾個月前有人問過類似的問題,但解決方案似乎建議等待實際時間。 顯然,如果您有 10 或 30 秒的超時,那么人們不想在他們的測試中真正等待 10 或 30 秒。

如果我正確理解你的問題,你正在尋找一種方法來測試異步/等待代碼。 如果這是正確的,讓我們假設您有以下DataDownloader ,它將執行一個異步函數來下載一些東西:

struct DataDownloader {
    func downloadData() async throws -> Data {
        ...
    }
}

為了調用該函數,我們需要使用await ,這基本上標志着調用需要在並發支持的上下文中發生。 幸運的是,Apple 的XCTest已經升級以支持它。 我們不需要將它包裝在Task中。 所以訣竅是在你的測試中你可以將任何函數標記為async並且你將使用await 下面是一個簡單的示例,您將如何在測試上下文中調用Downloader異步函數:

class DataDownloaderTests: XCTestCase {
    func testDataDownload() async throws {
        let dataDownloader = DataDownloader()
        let downloadedData = try await dataDownloader.downloadData()

        XCTAssertNil(resizedImage.size)
    }
}
func AsyncFunction() async -> Int {
  let result = await AsyncOperation()
  return result
}
let scheduler = TestScheduler()
let result = try scheduler.start {
  return try AsyncFunction().wait()
}
XCTAssertEqual(result, 42)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM