Await expectations with Swift Testing?

I'm used to wait for expectations when using XCTest, but I'm completely stumped by the seemingly-absent option for expecting some parts of my code to be called in Swift Testing 🤔

Consider the following:

protocol MyAPI {
  func getData() async throws -> String
}

class MockAPI: MyAPI {
  let stub: () async throws -> String 

  init(stub: @escaping () async throws -> String = { "hello" }) {
    self.stub = stub
  }

  func getData() async throws -> String {
    try await stub()
  }
}

Which is being used in my view model:

class MyViewModel: ObservableObject {
  private let api: MyAPI
 
  @Published
  var data: String

  init(api: MyAPI) {
    self.api = api
  }

  func refresh() async throws {
    self.data = try await api.getData()
  }
}

When I wrote tests in the past, I would simply override the stub of the MockAPI implementation and fulfill an expectation in there:

class MyViewModelTests: XCTestCase {
  func testModelCallsAPIOnRefresh() async throws {
    let expectCallsAPI = expectation("Model should call API")
    let api = MockAPI {
      expectCallsAPI.fulfill()
      return "hello"
    }
    let model = MyViewModel(api: api)
    try await model.refresh()

    await fulfillment(of: [expectCallsAPI], timeout: 1)
  }
}

How would I go about checking that my model does indeed call the API when using Swift Testing?

Answered by DTS Engineer in 801810022

Swift Testing renames some concepts. If you’re coming at this from an XCTest perspective then the equivalent of an expectation there is a confirmation in Swift Testing. See Testing asynchronous code.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Swift Testing renames some concepts. If you’re coming at this from an XCTest perspective then the equivalent of an expectation there is a confirmation in Swift Testing. See Testing asynchronous code.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Await expectations with Swift Testing?
 
 
Q