如何实现单元测试 fatalError
在Swift中代码路径的?
例如,我有以下快速代码
func divide(x: Float, by y: Float) -> Float {
guard y != 0 else {
fatalError("Zero division")
}
return x / y
}
Run Code Online (Sandbox Code Playgroud)
我想在y = 0时对单元进行单元测试.
注意,我想使用fatalError而不是任何其他断言函数.
看起来这个功能应该在即将推出的Swift 2.0/XCode 7版本中得到支持,这显然将包括try/catch优点,所以这个问题可能没有实际意义.当他们没有测试版时,我会尝试相应地更新这篇文章.
在Swift中,虽然我假设问题/答案适用于Objective-C,但我想编写一个foo
格式函数:
public class SomeClass{
public func foo(someString:String){
//validate someString
assert(!someString.isEmpty, "The someString parameter cannot be empty.")
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个assert
电话,因为我相信这是Apple推荐的,而不是抛出异常,这在其他语言中很常见.
但是,在我的单元测试中,我希望能够确保当someString
参数为空字符串时函数确实失败:
class SomeClass_Tests:XCTestCase{
func test_foo_someStringParamaterIsEmpty_error(){
//ACTION
let someClassInstance = SomeClass()
someClassInstance.foo("")
//VALIDATE
//**What goes here?
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到关于这种情况的文档或帖子,尽管我认为这是一个非常重要的单元测试,以确保类和库的正确行为和使用.
在包含异常/异常处理的其他语言中,assert
将替换为类似的东西throw SomeError()
然后,在单元测试中,您可以简单地将操作包装在try
/ catch
block中并声明异常确实已设置,如下所示:
class SomeClass_Tests:XCTestCase{
func test_foo_someStringParamaterIsEmpty_error(){
//ACTION
let someClassInstance = SomeClass()
var expectedException:SomeException? = nil
try{
someClassInstance.foo("")
}catch(someException:SomeException){
expectedException = someException
} …
Run Code Online (Sandbox Code Playgroud) 谷歌搜索让我找到了一般的 Swift 错误处理链接,但我有一个更具体的问题。我认为这里的答案是“不,你运气不好”,但我想仔细检查一下我是否遗漏了一些东西。几年前的这个问题看起来很相似,并且有一些看起来很粗糙的解决方法的答案......我想看看最新版本的 Swift 是否使更优雅的东西成为可能。
情况:我有一个未用 标记的函数throws
,并且使用try!
。
目标:我想创建一个单元测试来验证,是的,给这个函数错误的东西实际上会失败并抛出(运行时/致命)错误。
问题:
XCTAssertThrows
也没有捕获错误。该函数的构建目的是与另一个无声失败的函数具有相同的签名,我在模拟器上将其替换为该函数,以便在测试(自动或手动)期间可以大声失败。所以我不能只是将其更改为抛出函数,因为那样的话另一个函数必须被标记为抛出,并且我希望它默默地失败。
那么,有没有办法抛出一个可以在单元测试中捕获的未处理错误?
或者,我可以在不更改签名的情况下以可测试的方式让这个函数爆炸吗?