К сожалению, кажется невозможным, чтобы точки останова исключений игнорировали все, что заключено в XCTAssertThrows
(или теперь XCTAssertThrowsError
).
Обходной путь 1: работа с точками останова или сценарием вокруг них
Когда вы выполняете эти тесты, вы можете сделать следующее:
- Отключите точку останова исключения.
- Нажимайте Run каждый раз, когда он достигает одной из ваших точек останова.
Оба не идеальны, так как вы будете выполнять некоторую ручную работу.
Здесь есть предложения по отключения точек останова для утверждений Swift XCTAssertThrowsError. Я не тестировал их.
Обходной путь 2: вместо этого верните Result<T, Error>
Мой оригинальный метод выглядел так:
struct Truck {
static func makeTruck(numberOfWheels: Int) throws -> Self {
if numberOfWheels < 4 {
throw TruckError.tooFewWheels
}
// ...
return .init()
}
}
// Code example:
let truck: Truck? = try? Truck.makeTruck(numberOfWheels: 1)
// Test example:
XCTAssertThrowsError(try Truck.makeTruck(numberOfWheels: 1))
Чтобы обойти эту проблему с точками останова, я создал дублирующую внутреннюю функцию, которую легче тестировать (поскольку она не вызовет проблемы с точкой останова), возвращая Result
вместо Error
.
struct Truck {
static func _makeTruck(numberOfWheels: Int) -> Result<Truck, Error> {
if numberOfWheels < 4 {
return .failure(TruckError.tooFewWheels)
}
// ...
return .success(.init())
}
static func makeTruck(numberOfWheels: Int) throws -> Self {
switch _makeTruck(numberOfWheels: numberOfWheels) {
case .failure(let error):
throw error
case .success(let value):
return value
}
}
}
// Code example:
let truck: Truck? = try? Truck.makeTruck(numberOfWheels: 1)
// Test example:
XCTAssertEquals(Truck._makeTruck(numberOfWheels: 1), .error(TruckError.tooFewWheels))
Обходной путь 3: вместо этого верните T?
Наконец, если у вас есть более простой вариант использования, и сбой вашей функции вполне очевиден (например, существует только один тип ошибки, которую она может вернуть), рассмотрите возможность возврата необязательного параметра вместо необходимости сложности типа Result
:
struct Truck {
static func makeTruck(numberOfWheels: Int) -> Truck? {
if numberOfWheels < 4 {
return nil
}
// ...
return .init()
}
}
// Code example:
let truck: Truck? = Truck.makeTruck(numberOfWheels: 1)
// Test example:
XCTAssertNil(Truck.makeTruck(numberOfWheels: 1))
person
Senseful
schedule
07.11.2020