Browse Questions

Answer: Swift's async/await is directly supported in XCTest — mark your test function as async throws and await the result.

Code Example:

class UserServiceTests: XCTestCase {

    // Modern — async/await (iOS 15.0+, Xcode 13.2+)
    func test_fetchUser_returnsUser() async throws {
        let mockClient = MockHTTPClient()
        mockClient.mockData = try JSONEncoder().encode(User.mock())

        let service = UserService(client: mockClient)
        let user = try await service.fetchUser(id: 1)

        XCTAssertEqual(user.name, "Alice")
    }

    // Legacy — XCTestExpectation for callback-based async
    func test_fetchUser_callsCompletion() {
        let expectation = expectation(description: "fetch completes")

        service.fetchUser(id: 1) { user in
            XCTAssertNotNil(user)
            expectation.fulfill()
        }

        waitForExpectations(timeout: 5)
    }
}