2016-01-13 113 views

回答

1

对于斯威夫特,你可以只使用XCTAssertEqual

你的对象需要实现Equatable协议,宏可以使用==


例子:

import XCTest 

class A: Equatable { 
    let name: String 
    init(name: String) { 
     self.name = name 
    } 
} 
func ==(lhs: A, rhs: A) -> Bool { 
    return lhs.name == rhs.name 
} 

class FooTests: XCTestCase { 
    func testFoo() { 
     let a = A(name: "foo") 
     let a1 = A(name: "foo") 
     let b = A(name: "bar") 
     XCTAssertEqual(a, a) 
     XCTAssertEqual(a, a1) 
     XCTAssertEqual(a, b) // will fail 
    } 
} 
+0

不幸运。见我在http://stackoverflow.com/questions/25341705/xctassertequal-for-custom-objects-in-swift XCTAssertEqual评论不会触发断点在我==的自定义实现。 XCTAssertEqual似乎基于对象等价返回。要触发我的== func,我必须指定XCTAssertTrue(a == b) –

+0

@MaxMacLeod'XCTAssertEquals'确实使用了相等运算符。也许问题在于你的代码中的其他地方。 – Cristik

+0

@MaxMacLeod我已经添加了一个例子,在'=='func中设置断点三次停止执行。 – Pascal

0

我会有点更具体的了解你正在测试的内容。

平等和身份是不一样的事情,尤其是在斯威夫特那里有更加丰富的价值类型。

如果你想测试平等的一致性所定义的Equatable然后使用:

XCTAssertTrue(a == b) 

如果你想测试两个引用类型相同:

XCTAssertTrue(a === b) 

我觉得这是更好因为断言更加明确;是相同还是相同的对象。

记得斯威夫特价值类型的WWDC15会议 - 其中建议总是让你的值类型符合Equatable

+0

酷感谢@Abizern! –

相关问题