什么是XCTAssertEqualObjects的替代品?
问题描述:
不确定何时,但至少从Xcode 7.2,XCTAssertEqualObjects
不再可用。什么是XCTAssertEqualObjects的替代品?
是否有此一更换,而不必诉诸?
XCTAssertTrue(foo == bar)
需要注意的是苹果的"Writing Test Classes and Methods"出现过时,仍然是指缺少类。
答
对于斯威夫特,你可以只使用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
}
}
答
我会有点更具体的了解你正在测试的内容。
平等和身份是不一样的事情,尤其是在斯威夫特那里有更加丰富的价值类型。
如果你想测试平等的一致性所定义的Equatable
然后使用:
XCTAssertTrue(a == b)
如果你想测试两个引用类型相同:
XCTAssertTrue(a === b)
我觉得这是更好因为断言更加明确;是相同还是相同的对象。
记得斯威夫特价值类型的WWDC15会议 - 其中建议总是让你的值类型符合Equatable
。
+0
酷感谢@Abizern! –
不幸运。见我在http://stackoverflow.com/questions/25341705/xctassertequal-for-custom-objects-in-swift XCTAssertEqual评论不会触发断点在我==的自定义实现。 XCTAssertEqual似乎基于对象等价返回。要触发我的== func,我必须指定XCTAssertTrue(a == b) –
@MaxMacLeod'XCTAssertEquals'确实使用了相等运算符。也许问题在于你的代码中的其他地方。 – Cristik
@MaxMacLeod我已经添加了一个例子,在'=='func中设置断点三次停止执行。 – Pascal