【发布时间】:2015-08-03 14:53:17
【问题描述】:
更新:
看起来这个功能应该在即将到来的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.")
}
}
我使用assert 调用,因为我相信这是 Apple 推荐的,而不是像其他语言中常见的抛出异常。
但是,在我的单元测试中,我希望能够确保当someString 参数为空字符串时函数确实失败:
class SomeClass_Tests:XCTestCase{
func test_foo_someStringParamaterIsEmpty_error(){
//ACTION
let someClassInstance = SomeClass()
someClassInstance.foo("")
//VALIDATE
//**What goes here?
}
}
我找不到关于这种情况的文档或帖子,尽管我认为这是一个非常重要的单元测试,以确保类和库的正确行为和使用。
在包含异常/异常处理的其他语言中,assert 将被替换为 throw SomeError() 之类的东西,然后,在单元测试中,您可以简单地将操作包装在 try/catch 块中并断言确实设置了异常,如下所示:
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
}
//VALIDATE
XCTAssertIsNotNil(expectedException)
}
}
但是我在文档中看到的 Swift 中没有这样的构造或等效的解决方法。是否有任何已知的解决方案或变通方法可用于执行此类测试?
【问题讨论】:
-
XCTest 应该有一个 did-assert 或 did-not-assert 断言是绝对正确的(尽管通过启用/禁用断言的构建配置会稍微复杂一些 - 对测试先决条件和致命错误更有用大概)。 Brian Gesiak 写了this post 关于一些限制并提交了this radar 专门关于断言。
-
感谢@AirspeedVelocity,这些链接非常有用。我认为缺乏真正的“异常”是由于一些狂妄自大(让人想起初级开发人员将“抛出异常”等同于“抛出错误”),而对我来说,这很快成为我认为的痛处相当有趣的语言/框架。
-
我对例外情况持谨慎态度。一方面,是的,能够捕获意外溢出会很好。另一方面,通常用于非真正异常原因的异常在其他语言中完全是诅咒......所以总而言之,我永远不会快乐......
-
哦,是的,例外绝对是整个大国/大责任的经典案例。
标签: ios swift unit-testing assertions xctest