[英]XCTAssertEqual for custom objects in Swift
XCode 6,測試版 5
我有這樣的單元測試:
func testMyObjectsEqual() { //.... XCTAssertEqual(myObject, myOtherObject, "\(myObject) and \(myOtherObject) should be equal") }
XCTAssertEqualObjects 在 Swift 中不再可用,因為該語言不區分標量和對象。
所以我們必須使用 XCTAssertEqual 這會導致以下錯誤:
"Type MyObject does not conform to protocol Equatable"
我發現的唯一解決方法是從 NSObject 繼承 (MyObject) 以便我可以執行以下操作:
XCTAssert(myObject == myOtherObject, "\(myObject) and \(myOtherObject) should be equal")
所以我的問題是:有沒有一種方法(從 beta 5 開始)將 XCTAssertEqual 用於自定義類型,而不必依賴 NSObject 或用“==”重載亂丟所有自定義類型?
如果要比較Swift中的引用,可以使用===
運算符。 當您從NSObject XCTAssertEqual
子類時會發生這種情況(當您使用XCTAssertEqual
比較Objective-C中的XCTAssertEqual
,您正在比較引用)。
但這真的是你想要的嗎?
class MyObject {
var name: String
init(name: String) {
self.name = name
}
}
func testMyObjectsEqual() {
let myObject = MyObject(name: "obj1")
let myOtherObject = MyObject(name: "obj1")
let otherReferenceToMyFirstObject = myObject
XCTAssert(myObject === myOtherObject) // fails
XCTAssert(myObject === otherReferenceToMyFirstObject) // passes
}
我想當你比較自定義對象時,你可能應該使它們符合Equatable協議,並在你的自定義對象相等時指定(在下面的例子中,當它們具有相同名稱時對象是相同的):
class MyObject: Equatable {
var name: String
init(name: String) {
self.name = name
}
}
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.name == rhs.name
}
func testMyObjectsEqual()
{
let myObject = MyObject(name: "obj1")
let myOtherObject = MyObject(name: "obj1")
XCTAssertEqual(myObject, myOtherObject) // passes
}
由於 Xcode 12.5 有XCTAssertIdentical
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.