Swift 4 - XCTAssertThrowsError 失败:没有抛出错误
Posted
技术标签:
【中文标题】Swift 4 - XCTAssertThrowsError 失败:没有抛出错误【英文标题】:Swift 4 - XCTAssertThrowsError failed: did not throw an error 【发布时间】:2019-05-17 14:35:46 【问题描述】:我正在测试SFSpeechRecognizer
的错误处理。我无法让函数使用XCTAssertThrowsError()
引发错误。
如果没有语言环境,创建 SFSpeechRecognizer
将返回一个对象或 nil
。
public convenience init?() // Returns speech recognizer with user's current locale, or nil if is not supported
public init?(locale: Locale) // returns nil if the locale is not supported
func createSpeechRecognization(locale : Locale) throws -> SFSpeechRecognizer
guard let speechRecognizer = SFSpeechRecognizer(locale: locale) else
throw SpeechToTextError.speechRecognizerIsNil
return speechRecognizer
这是我尝试抛出的单元测试函数:
func testCreateSpeechToTextAudiosessionNotNotAvailable()
XCTAssertThrowsError(try sut.createSpeechRecognization(locale: Locale.current)) error in
XCTAssertEqual(error as? SpeechToTextError, SpeechToTextError.speechRecognizerIsNil)
单元测试因错误而失败:
XCTAssertThrowsError 失败:没有抛出错误。
我不确定为什么会这样。有什么建议吗?
【问题讨论】:
测试失败,因为createSpeechRecognization
应该抛出,但它没有。 SFSpeechRecognizer(locale:)
是一个可失败的初始化程序,但是对于参数 Locale.current
它返回了一个有效实例,因此 createSpeechRecognization
没有抛出。一切都按预期工作。
XCTAssertThrowsError 是否使 createSpeechRecognization 抛出异常?我想让它为零,这样我就可以测试错误处理了。
不,它断言它是否抛出 - 而对于 Locale.current
它没有。
啊,谢谢你的澄清
使用函数SFSpeechRecognizer.supportedLocales()
,然后尝试使用它不支持的语言环境初始化SFSpeechRecognizer
【参考方案1】:
XCTAssertThrowsError
不会让函数抛出异常,它只是断言,感谢@mag_zbc。
我将单元测试修改为:
func testCreateSpeechToTextAudioSessionNotNotAvailable()
var locale : Locale = Locale(identifier: "pwned")
XCTAssertThrowsError(try sut.createSpeechRecognization(locale: locale)) error in
XCTAssertEqual(error as? SpeechToTextError, SpeechToTextError.speechRecognizerIsNil)
它通过了测试。
【讨论】:
以上是关于Swift 4 - XCTAssertThrowsError 失败:没有抛出错误的主要内容,如果未能解决你的问题,请参考以下文章