测试异步代码
可靠地验证 async/await 流程。
测试异步代码 是 CoddyKit 上的免费 SwiftUI Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SwiftUI Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SwiftUI Academy 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Async Needs Special Care
Network calls and tasks finish later, not instantly. Your tests must wait for the result before asserting, or they check too early. ⏳
Mark the Test async
The simplest fix is an async test method. Swift lets you await directly, and the runner pauses until the work completes.
func testLoad() async {
}Await Your Method
Inside an async test you can use await just like real code. The line pauses until your ViewModel finishes loading.
await vm.load()Assert After Awaiting
Once the await returns, the data is ready. Now your assertion checks the final state, not an empty one. ✅
XCTAssertEqual(vm.items.count, 3)Throwing Async Tests
If the code can throw, mark the test throws too. Then try await lets errors bubble up and fail the test cleanly.
func testFetch() async throws {
try await vm.fetch()
}Avoid Real Networks
Hitting a live server makes tests slow and flaky. Inject a mock service that returns fixed data instead.
A Mock Service
A mock conforms to the same protocol but returns canned values. Your ViewModel cannot tell the difference, so the logic is tested honestly.
struct MockAPI: API {
func load() async -> [Item] { sample }
}Testing the Error Path
Make your mock throw on demand. Then you can verify the ViewModel sets an error state instead of crashing.
Expectations for Callbacks
For older callback APIs, use an XCTestExpectation. Fulfill it inside the callback, then wait so the test does not end early.
let exp = expectation(description: "done")Wait With a Timeout
Pair every expectation with a timeout. If the callback never fires, the test fails fast instead of hanging forever.
await fulfillment(of: [exp], timeout: 2)Prefer async Over Callbacks
When you can, write code with async/await. Tests stay short, linear, and far easier to read than nested callbacks.
Quick Check
How should you wait for async work in a modern XCTest?
Recap
You can now test async code: mark tests async, await results, mock the network, and use expectations for callbacks. Reliable every run. 🎉
常见问题解答
「测试异步代码」课时是免费的吗?
是的 — 「测试异步代码」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SwiftUI Academy 课程的其余内容,请升级到 CoddyKit PRO。 SwiftUI Academy 课程共包含 4 节课。
「测试异步代码」这节课中我会学到什么?
可靠地验证 async/await 流程。 你通过在浏览器中直接运行的动手代码来练习 SwiftUI Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SwiftUI Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SwiftUI Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「测试异步代码」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SwiftUI Academy 课中编写并运行代码吗?
能。每节 SwiftUI Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。