[英]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.