我写了以下函数:
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捕获的错误/异常并不意味着测试失败?
答案 0 :(得分:2)
do-catch
语句仅用于捕获函数抛出的错误。他们没有抓住例外。例外用于表示存在编程错误。
如果obj不会生成有效的JSON,则抛出异常。在解析之前抛出此异常并表示编程错误,而不是内部错误。在使用
isValidJSONObject:
调用此方法之前,应检查输入是否会生成有效的JSON。
发生的事情是message
不是可以在json中表示的对象。我的猜测是wspace
包含一个无法转换为json的类型。