我们在单元测试中广泛使用Pointfree组合调度程序,特别是TestScheduler。
是否有一种方法可以使用相同的库,或者类似的测试调度器库,在Swift中使用新的async/await ?基本上,你可以通过编程在async/await产生的响应式流中移动和前进吗?为什么我们需要这个?正如Pointfree所描述的:
这个调度器用于测试时间流的影响使用异步操作符(如debounce)的发布者,节流、延迟、超时、接收(on:)、订阅(on:)等
Swift最近推出了Swift异步算法,其中包括对这些操作符的支持。社区如何测试这些运营商?
几个月前也有人问过类似的问题,但解决方案似乎建议等待实际的时间。显然,如果你有一个10或30秒的超时,人们不希望在他们的测试中等待10或30秒。
https://github.com/pointfreeco/combine-schedulers的作者已经发布了https://github.com/pointfreeco/swift-clocks,它用于AsyncSequence
的相同目的。
如果我正确理解你的问题,你正在寻找一种方法来测试async/await代码。如果这是正确的,让我们假设您有以下DataDownloader
,它将执行一个async函数来下载一些东西:
struct DataDownloader {
func downloadData() async throws -> Data {
...
}
}
为了调用这个函数,我们需要使用await
,这基本上标志着调用需要在并发支持的上下文中发生。幸运的是,苹果的XCTest
已经升级到支持这一点。我们不需要在Task
中包装它。所以诀窍是,在你的测试中,你可以将任何函数标记为async
,你将使用await
。下面是一个简单的示例,如何在测试上下文中调用Downloader
async函数:
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)