Протестируйте async throws-функцию и проверьте, что брошена именно нужная ошибка
UserLoader.load(id:) — это async throws-функция, которая должна бросать LoaderError.notFound, когда id не положителен. Напишите модульный тест, который дожидается вызова и проверяет, что брошена именно эта ошибка — а не просто какая-то ошибка.
Требования:
- Используйте
async/awaitв тесте; не блокируйте семафором. - Проверяйте конкретный случай ошибки, чтобы чужая ошибка или неожиданный успех тоже валили тест.
enum LoaderError: Error, Equatable { case notFound, network }
struct UserLoader {
func load(id: Int) async throws -> String {
guard id > 0 else { throw LoaderError.notFound }
return "user-\(id)"
}
}
func testLoadThrowsNotFound() async {
// ваш код здесь
}
Допишите реализацию.
Дождитесь вызова в async-тесте и проверьте конкретный случай ошибки, а не просто факт броска. Используйте await #expect(throws: LoaderError.notFound) { ... } или XCTest-блок do/catch, который валит тест при успехе и проверяет .notFound.
- ✗Проверяют лишь факт броска ошибки, а не какой именно случай
- ✗Блокируют семафором вместо написания async-теста
- ✗Забывают валить тест, когда вызов неожиданно вернул значение
- →Как
#expect(throws:)сравнивает брошенную ошибку с ожидаемым случаем? - →Почему тест обязан упасть, если вызов вернул значение, а не бросил?
The concrete-case assertion is the whole point — a bare try await only proves something threw.
// Swift Testing — the concise form
@Test func loadThrowsNotFound() async {
let loader = UserLoader()
await #expect(throws: LoaderError.notFound) {
try await loader.load(id: 0)
}
}
// XCTest — explicit do/catch
func testLoadThrowsNotFound() async {
let loader = UserLoader()
do {
_ = try await loader.load(id: 0)
XCTFail("expected notFound, but the call returned")
} catch {
XCTAssertEqual(error as? LoaderError, .notFound)
}
}
#expect(throws: LoaderError.notFound) fails when the closure throws a different case or does not throw at all. In the XCTest form, XCTFail on the success path guards against a silent return, and XCTAssertEqual against .notFound (thanks to Equatable) rejects a wrong error case.