在即将到来的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中没有这样的构造或等效的解决方法。是否有任何已知的解决方案或解决方法来执行此类测试?
答案 0 :(得分:1)
但是,在我的单元测试中,我希望能够确保当someString参数为空String时函数确实失败
我理解你正在尝试做什么,因为我自己在Ruby程序中完成了它。但Swift(我经常有机会观察)不是Ruby!这里的问题是,当registerDesignerProxyListener_
参数为空字符串时,您可以保证函数不失败 - 在您的实际应用中。这是因为断言不在发布版本中运行。
结果是你可以在开发过程中使用assert作为调试的一种形式,但如果这种情况在现实生活中发生,你应该按顺序处理它,而不是崩溃。
然后测试断言是否发生"实际上并不是一种有效的单元测试技术,这就是你以这种方式使用它的原因。
答案 1 :(得分:1)
为什么尝试捕获错误而不是检查发生了什么而不是测试断言被抛出?
XCTAssertThrows()
而不是看到价值观 ?
答案 2 :(得分:0)
您可以签出XCTest框架中提供的XCTAssertThrows
和XCTAssertThrowsSpecific
宏。
也许您需要用[NSException raise]
替换断言才能使其正常工作。
答案 3 :(得分:0)
Matt Gallagher的CwlPreconditionTesting project on github添加了catchBadInstruction
函数,使您能够在单元测试代码中测试断言/先决条件失败。
CwlCatchBadInstructionTests file显示了其使用的简单说明。 (请注意,它仅适用于iOS的模拟器。)