Bird
Raised Fist0
Swiftprogramming~20 mins

Testing async code in Swift - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Async Testing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this async function call?

Consider the following Swift async function and its call. What will be printed?

Swift
func fetchNumber() async -> Int {
    return 42
}

Task {
    let number = await fetchNumber()
    print(number)
}
A0
Bnil
C42
DCompilation error
Attempts:
2 left
💡 Hint

Remember that await waits for the async function to complete and returns the value.

❓ Predict Output
intermediate
2:00remaining
What error does this async function cause?

What error will this Swift code produce when run?

Swift
func fetchData() async throws -> String {
    throw NSError(domain: "Test", code: 1)
}

Task {
    let data = try await fetchData()
    print(data)
}
ARuntime error: unhandled error
BCompilation error: missing try
CPrints empty string
DNo error, prints data
Attempts:
2 left
💡 Hint

The function throws an error but the call site does not handle it.

🧠 Conceptual
advanced
2:00remaining
Which statement about async testing is true?

In Swift async testing, which statement is correct?

AYou must use <code>await</code> inside test functions marked with <code>async</code>.
BAsync functions cannot be tested with XCTest.
CAsync tests run synchronously by default.
DYou cannot use <code>Task</code> inside test functions.
Attempts:
2 left
💡 Hint

Think about how async test functions handle asynchronous calls.

❓ Predict Output
advanced
2:00remaining
What is the output of this async sequence processing?

What will this Swift code print?

Swift
func numbers() async -> [Int] {
    return [1, 2, 3]
}

Task {
    let nums = await numbers()
    let doubled = nums.map { $0 * 2 }
    print(doubled)
}
A[1, 2, 3]
B[2, 4, 6]
CCompilation error: cannot use map here
DRuntime error: await on non-async context
Attempts:
2 left
💡 Hint

Remember await gets the array, then map doubles each element.

🔧 Debug
expert
2:00remaining
Why does this async test fail to wait for completion?

Given this Swift test code, why does the test finish before the async call completes?

Swift
func testAsyncCall() {
    Task {
        let result = await fetchValue()
        XCTAssertEqual(result, 10)
    }
}
AfetchValue() is not an async function.
BThe <code>await</code> keyword is missing inside the Task.
CXCTAssertEqual cannot be used inside Task closures.
DThe test function is not marked async, so it does not wait for Task to finish.
Attempts:
2 left
💡 Hint

Think about how XCTest waits for async code to finish.

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

  1. Step 1: Understand async test function requirement

    To test asynchronous code, the test function itself must be marked as asynchronous.
  2. Step 2: Identify the correct keyword

    The keyword to mark a function as asynchronous in Swift is async.
  3. Final Answer:

    async -> Option C
  4. 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

  1. Step 1: Recall await usage in Swift

    In Swift, to wait for an async function, you use the await keyword before the function call.
  2. Step 2: Check correct syntax

    The correct syntax is let result = await fetchData(). The keyword await comes before the function call.
  3. Final Answer:

    let result = await fetchData() -> Option A
  4. 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

  1. Step 1: Analyze fetchData() behavior

    The function fetchData() is async and throws but always returns "Hello" without throwing an error.
  2. 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.
  3. Step 3: Evaluate print statement

    Since data is not nil, the print outputs "Got Data".
  4. Final Answer:

    Got Data -> Option D
  5. 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

  1. Step 1: Check async function call

    The function fetchData() is async, so calling it requires await to get the result.
  2. Step 2: Identify missing await

    In the test, fetchData() is called without await, causing a compile error.
  3. Final Answer:

    Missing await before fetchData() call -> Option B
  4. Quick Check:

    Async calls need await = Missing await before fetchData() call [OK]
Hint: Always await async calls inside async functions [OK]
Common Mistakes:
  • Calling async function without await
  • Thinking test functions can't be async
  • Misusing XCTAssertEqual with strings
  • Assuming async functions must throw
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) }
D. func testLoadUserError() async throws { _ = try await loadUser(id: -1) XCTAssertTrue(false) }

Solution

  1. Step 1: Understand error throwing test pattern

    To test that an async function throws, use a do-catch block and call the function with try await.
  2. Step 2: Verify correct error handling

    func testLoadUserError() async throws { do { _ = try await loadUser(id: -1) XCTFail("Expected error not thrown") } catch { XCTAssertTrue(true) } } calls loadUser(id: -1) with try await inside do, fails test if no error, and passes if error caught.
  3. Step 3: Check other options

    Approaches expecting a nil user incorrectly assume throwing functions return nil instead of throwing. func testLoadUserError() async throws { _ = try await loadUser(id: -1) XCTAssertTrue(false) } fails test unconditionally.
  4. Final Answer:

    do { _ = try await loadUser(id: -1) XCTFail("Expected error not thrown") } catch { XCTAssertTrue(true) } -> Option A
  5. Quick Check:

    Use do-catch with try await to test errors [OK]
Hint: Use do-catch with try await to test thrown errors [OK]
Common Mistakes:
  • Expecting nil instead of catching error
  • Omitting try or await keywords
  • Failing test unconditionally
  • Not marking test async throws
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard