This program defines an async function that waits half a second and returns 42. The test checks if the returned number is 42 and prints a success message.
Swift
import XCTest
class AsyncTests: XCTestCase {
func fetchNumber() async -> Int {
// Simulate async delaytry? await Task.sleep(nanoseconds: 500_000_000) // 0.5 secondsreturn42
}
func testFetchNumber() async {
let number = await fetchNumber()
XCTAssertEqual(number, 42)
print("Test passed: number is \(number)")
}
}
// Run the test manually (for playground or script)
@main
struct Main {
staticfunc main() async {
let tests = AsyncTests()
await tests.testFetchNumber()
}
}
OutputSuccess
Important Notes
Remember to mark test functions with async when testing async code.
Use await to pause until the async task finishes before checking results.
In XCTest, async tests can throw errors, so use async throws if needed.
Summary
Async tests let you check code that runs at different times.
Use async and await keywords in test functions.
Test both success and error cases for async functions.
Practice
(1/5)
1. What keyword must you add to a Swift test function to test asynchronous code?
easy
A. defer
B. await
C. async
D. try
Solution
Step 1: Understand async test function requirement
To test asynchronous code, the test function itself must be marked as asynchronous.
Step 2: Identify the correct keyword
The keyword to mark a function as asynchronous in Swift is async.
Final Answer:
async -> Option C
Quick Check:
async = async [OK]
Hint: Mark test functions with async to test async code [OK]
Common Mistakes:
Using await instead of async on test function
Forgetting to mark test function as async
Using try instead of async
Confusing defer with async
2. Which of the following is the correct syntax to wait for an async function fetchData() inside a test?
easy
A. let result = await fetchData()
B. let result = async fetchData()
C. await let result = fetchData()
D. fetchData().await()
Solution
Step 1: Recall await usage in Swift
In Swift, to wait for an async function, you use the await keyword before the function call.
Step 2: Check correct syntax
The correct syntax is let result = await fetchData(). The keyword await comes before the function call.
Final Answer:
let result = await fetchData() -> Option A
Quick Check:
await before function call = let result = await fetchData() [OK]
Hint: Put await before async function call to wait [OK]
Common Mistakes:
Placing await after let or variable
Using async instead of await before call
Calling await as a method
Omitting await keyword
3. Given this test code, what will be printed?
func testFetch() async {
let data = try? await fetchData()
print(data == nil ? "No Data" : "Got Data")
}
func fetchData() async throws -> String {
return "Hello"
}
medium
A. No Data
B. Compilation error
C. Runtime error
D. Got Data
Solution
Step 1: Analyze fetchData() behavior
The function fetchData() is async and throws but always returns "Hello" without throwing an error.
Step 2: Understand try? await usage
The try? await fetchData() will return the string "Hello" wrapped as optional, not nil, because no error is thrown.
Step 3: Evaluate print statement
Since data is not nil, the print outputs "Got Data".
Final Answer:
Got Data -> Option D
Quick Check:
try? await returns value = Got Data [OK]
Hint: try? returns nil only if error thrown, else returns value [OK]
Common Mistakes:
Assuming try? always returns nil
Confusing async throws with throwing error always
Ignoring optional unwrapping
Expecting compilation error due to async
4. Identify the error in this async test function:
func testDownload() async {
let result = fetchData()
XCTAssertEqual(result, "Success")
}
func fetchData() async -> String {
return "Success"
}
medium
A. XCTAssertEqual cannot compare strings
B. Missing await before fetchData() call
C. Test function should not be async
D. fetchData() must throw an error
Solution
Step 1: Check async function call
The function fetchData() is async, so calling it requires await to get the result.
Step 2: Identify missing await
In the test, fetchData() is called without await, causing a compile error.
Final Answer:
Missing await before fetchData() call -> Option B
Quick Check:
Async calls need await = Missing await before fetchData() call [OK]
5. You want to test an async function loadUser(id:) that throws an error if the user is not found. Which test code correctly checks that an error is thrown for an invalid id?
hard
A. func testLoadUserError() async throws {
do {
_ = try await loadUser(id: -1)
XCTFail("Expected error not thrown")
} catch {
XCTAssertTrue(true)
}
}
B. func testLoadUserError() async {
let user = try await loadUser(id: -1)
XCTAssertNil(user)
}
C. func testLoadUserError() async throws {
let user = await loadUser(id: -1)
XCTAssertNil(user)
}