XCTAssertEqual用于Swift中的自定义对象

XCode 6,Beta 5

我有一个像这样的unit testing:


     func testMyObjectsEqual()
     {
         // ....

         XCTAssertEqual(myObject,myOtherObject,“\(myObject)和\(myOtherObject)应该等于”)
     }

XCTAssertEqualObjects在Swift中不再可用,因为该语言在标量和对象之间没有区别。

所以我们必须使用导致以下错误的XCTAssertEqual:

  “typesMyObject不符合协议Equatable” 

我发现唯一的解决方法是从NSObjectinheritance(MyObject),以便我可以执行以下操作:

  XCTAssert(myObject == myOtherObject,“\(myObject)和\(myOtherObject)应该是相等的”) 

所以我的问题是: 有没有一种方法(从testing版5)使用XCTAssertEqual自定义types,而不必依靠NSObject或抛出所有自定义types与“==”重载?

如果你想比较Swift中的引用,你可以使用===运算符。 这是从NSObject子类(当您使用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 } 

我想,当你比较自定义对象时,你可能应该使它们符合可衡量协议,并指定,当你的自定义对象是相等的(在下面的情况下,对象是相同的,当他们有相同的名称):

 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 }