xcode 将捕获错误视为测试失败

Posted

技术标签:

【中文标题】xcode 将捕获错误视为测试失败【英文标题】:xcode treating catching an error as a test failure 【发布时间】:2016-01-11 16:45:15 【问题描述】:

我写了以下函数:

func sendMessage(message:Dictionary<String,AnyObject>) 
    do 
        let json = try NSJSONSerialization.dataWithJSONObject(message, options: [])
        let jsonStr = NSString(data: json, encoding: NSUTF8StringEncoding)
        self.wsSource.writeString(jsonStr as! String)
     catch let err as NSError 
        Rc2LogError ("error sending json message on websocket:\(err)")
    

这是一个应该通过的单元测试:

func testSendMessageFailure() 
    let dict = ["foo":wspace!, "bar":22]
    session!.sendMessage(dict)
    XCTAssertNil(wsSrc.lastStringWritten)

但测试失败并显示以下消息:

test failure: -[Rc2SessionTests testSendMessageFailure()] failed: failed: caught "NSInvalidArgumentException", "Invalid type in JSON write (Rc2.Rc2Workspace)"

这不是失败。这是我所期望的!这是否意味着不可能编写一个调用具有处理错误的错误处理程序的函数的单元测试?

我如何告诉 XCTest/Xcode 捕获的错误/异常并不意味着测试失败?

【问题讨论】:

【参考方案1】:

do-catch 语句仅用于捕获函数抛出的错误。它们不会捕获异常。异常用于表明存在编程错误。

如果 obj 不会生成有效的 JSON,则会引发异常。此异常在解析之前抛出,表示编程错误,而不是内部错误。您应该在使用isValidJSONObject: 调用此方法之前检查输入是否会生成有效的JSON。

来源:NSJSONSerialization


发生的事情是message 不是一个可以用 json 表示的对象。我的猜测是wspace 包含无法转换为 json 的类型。

【讨论】:

是的,它故意包含一个不可序列化的对象。我不熟悉 isValidJSONObject:,我可以调用它来获得我想要的功能。

以上是关于xcode 将捕获错误视为测试失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行中捕获 OCUnit 的测试失败/成功?

Karma/Jasmine 测试失败并出现错误:'未捕获的错误:尚未为上下文加载模块名称“simple_test.js”:_。使用要求([])'

如何捕获整数(0)?

Youtube API未捕获(在承诺中)错误:请求失败,状态码为403

Appium 错误:Logcat 捕获失败:使用 Android Studio 生成 ENOENT

未捕获的错误:模块解析失败:您可能需要适当的加载程序来处理此文件类型