我正在编写一个测试方法,我希望 SUT 在特定条件下抛出异常。代码如下所示:
- (void) testCantStartTwice
{
XCTAssertThrows([self.sut start], @"");
}
现在,一切都很好,测试通过了。但是,我让 Xcode 为所有 ObjC 异常设置了一个异常断点,这在调试器中测试应用程序时非常有用。就像您现在一样,现在当我使用 ⌘U 执行我的测试套件时,现在它会在该测试处停止并且看起来好像它失败了,即使它说“测试成功”。
有什么方法可以使断点在该测试中不停止?
谢谢,祝一切顺利
最佳答案
不幸的是,似乎不可能让异常断点忽略 XCTAssertThrows
中包含的任何内容(或现在 XCTAssertThrowsError
)。
解决方法 1:处理断点或断点周围的脚本
执行这些测试时,您可以执行以下操作:
- 禁用异常断点。
- 每次遇到您的断点之一时点击运行。
两者都不理想,因为您将进行一些手动工作。
有how to disable breakpoints for Swift XCTAssertThrowsError assertions here的建议.我没有测试过这些。
解决方法 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))
关于ios - XCTAssertThrows 在断点处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020527/