我有一个带有计算变量的模型对象。现在我想测试变量的setter。我写了一个测试用例,它给出了以下错误
我已经提到了我写的测试用例XCTAssertEqual失败:(“nil”)不等于(“Optional(”example@gmail.com“)”) -
func testNetworkModelObjectSet() {
let testObject = ["network": ["first_name": "Dimuth", "last_name": "Lasantha", "business_email": "testemail@gmail.com", "currency": "USD", "language": "en-us", "category": "individual"]]
let network = HVConnection(data: testObject)
network.business_email = "example@gmail.com"
XCTAssertEqual(network.business_email, "example@gmail.com")
}
这里我提到了相关的模型对象变量
class HVConnection: NSObject {
//private var _data: NSMutableDictionary
private var _data: NSMutableDictionary
// MARK:- Init
init(data: NSDictionary)
{
_data = NSMutableDictionary(dictionary: data)
}
var business_email: String? {
get {
if let businessemailObject = _data.objectForKey("network")?.objectForKey("business_email") {
return (businessemailObject as! String)
} else {
return nil
}
}
set {
_data = ["business_email": newValue!]
}
}
}
答案 0 :(得分:1)
您正在阅读_data["network"]["business_email"]
,但写信给_data["business_email"]
。您应该根据规范更新getter或setter。
作为旁注,您可以用更短/可读的方式重写getter:
get {
return _data["network"]?["business_email"] as? String
}
Swift的optional chaining功能使得在方法调用链中检查nil非常容易。
另请注意,如果传递nil
值,则setter会使应用程序崩溃,因为在尝试解包nils时强制解包会崩溃。
答案 1 :(得分:0)
通过设置network.business_email = "example@gmail.com"
,您将使用_data
覆盖["business_email": newValue!]
的内容。
这将导致getter返回nil
,因为它将进入else
案例,因为_data.objectForKey("network")
为nil
。因此,行为符合预期。
答案 2 :(得分:0)
我更改了setter,如下所示
set {
_data = ["network":["business_email": newValue!]]
}
现在测试用例已通过