【问题标题】:xcode treating catching an error as a test failurexcode 将捕获错误视为测试失败
【发布时间】: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 捕获的错误/异常并不意味着测试失败?

【问题讨论】:

    标签: xcode swift unit-testing


    【解决方案1】:

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

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

    来源:NSJSONSerialization


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

    【讨论】:

    • 是的,它故意包含一个不可序列化的对象。我不熟悉 isValidJSONObject:,我可以调用它来获得我想要的功能。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2021-07-15
    • 2020-06-24
    • 2015-10-14
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多