你可以在swift中使用async/await和测试调度器吗?



我们在单元测试中广泛使用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。下面是一个简单的示例,如何在测试上下文中调用Downloaderasync函数:

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)

相关内容

  • 没有找到相关文章

最新更新