2017-03-29 35 views
0

成功我有这样的成功测试:迅速XCTAssertEquals与可选

func testProfileFieldValue() { 
    let realm = try! Realm() 
    let vs = ["name":"n"] 
    createOrUpdate(realm: realm, value: vs) 
    let profile = realm.objects(Profile.self).first 
    XCTAssertEqual("n", profile?.name) 
} 
private func createOrUpdate(realm:Realm, value: Any = [:]) { 
    try! realm.write() { 
     realm.create(Profile.self,value:value,update: true) 
    } 
} 

为什么这个测试成功吗? “n”不是可选的。如果我尝试断言:

XCTAssertEqual("nf", profile?.name) 

我在Xcode得到这个失败的消息:

XCTAssertEqual失败:( “可选(” NF “)”)不等于 ( “可选(” n“)”)

为什么“nf”是和可选的?

THX

+3

'profile?.name'是可选的,因此''n“'是由编译器自动包装成可选的,以便可以比较这两个值。比较http://stackoverflow.com/a/38587571/1187415。 –

回答

1

请尝试这种方式apple suggest

if let profilename= profile?.name { 
    XCTAssertEqual("n", profilename) 
} 
else { 
    XCTFail("Value isn't set") 
} 

UPDATE: @MartinR评论好点出:

左侧"nf"非可选自动获得升级为可选项。因为profile?.name是一个选项a

更多检查这个 Swift comparing Strings optionals vs non-optional

+0

即使没有'让'我的测试成功,我想明白为什么。 –

+0

@ chiarotto.alessandro请检查https://bugs.swift.org/browse/SR-1417 –

1

还有的XCTAssertEqual<T>多个定义。其中有评估为T的表达式,以及评估为T?的表达式。一个非可选项可以与另一个非可选项进行比较。一个可选项可以与另一个可选项相比较。

怎么使用

XCTAssertEqual("n", profile?.name) 

发生的事情是编译器看到第二个表达式的计算结果为一个可选的字符串。然后它将第一个表达式隐式转换为可选项,以便进行比较。这就是为什么失败消息显示双方都是可选的。