2017-03-29 38 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) 

發生的事情是編譯器看到第二個表達式的計算結果爲一個可選的字符串。然後它將第一個表達式隱式轉換爲可選項,以便進行比較。這就是爲什麼失敗消息顯示雙方都是可選的。