我正在编写一个测试方法,我希望SUT在某些条件下抛出异常。代码如下所示:
- (void) testCantStartTwice
{
XCTAssertThrows([self.sut start], @"");
}
现在,一切都很好,测试通过了。但是,我让Xcode为所有ObjC异常设置了一个异常断点,这在测试器中测试应用程序时非常有用。就像你现在一样,现在当我用⌘U执行我的测试套件时,现在它在那个测试中停止,看起来它是否失败,即使它显示“Test Succeeded”。
在该测试中任何使断点不停止的方法?
谢谢,一切顺利
答案 0 :(得分:1)
在测试时,也许您可以使用测试失败断点而不是异常断点。 wwdc 2013关于单元测试的视频概述了用于检查测试失败的非常好的工作流程。它基本上说:
这不是一个直接的答案,但据我所知,我认为没有办法为异常断点创建例外。希望它有所帮助
答案 1 :(得分:0)
我有同样的问题,我正在寻找2小时的解决方案。可能我们对此无能为力。
答案 2 :(得分:0)
不幸的是,似乎不可能让异常断点忽略XCTAssertThrows
(或现在XCTAssertThrowsError
)中包装的任何内容。
执行这些测试时,您可以执行以下操作:
这两种方法都不理想,因为您将要进行一些手动工作。
how to disable breakpoints for Swift XCTAssertThrowsError assertions here有一些建议。我还没有测试过。
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))
T?
最后,如果您有一个简单的用例,并且函数的失败很明显(例如,它只能返回一种错误),请考虑只返回一个可选值,而不需要{{1 }}类型:
Result