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 }