XCTAssertEqualObjects 的替代品是啥?
Posted
技术标签:
【中文标题】XCTAssertEqualObjects 的替代品是啥?【英文标题】:What is the replacement for XCTAssertEqualObjects?XCTAssertEqualObjects 的替代品是什么? 【发布时间】:2016-01-13 10:41:35 【问题描述】:不确定具体时间,但至少在 Xcode 7.2 中,XCTAssertEqualObjects
不再可用。
有没有不用求助的替代品?
XCTAssertTrue(foo == bar)
请注意,Apple 的 "Writing Test Classes and Methods" 似乎已过时,仍然指的是缺失的类。
【问题讨论】:
【参考方案1】:对于 Swift,您可以使用 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
【讨论】:
不幸的是不起作用。请参阅我对***.com/questions/25341705/… XCTAssertEqual 的评论不会在我的== 自定义实现中触发断点。 XCTAssertEqual 似乎基于对象等价返回。要触发我的 == 函数,我必须指定 XCTAssertTrue(a == b) @MaxMacLeodXCTAssertEquals
确实使用了相等运算符。也许问题出在代码的其他地方。
@MaxMacLeod 我已经添加了一个例子,在==
func 中设置一个断点停止执行三次。
@MaxMacLeod:如果该类继承自 NSObject,那么您可能必须覆盖 isEqual:
而不是 ==
。比较***.com/questions/33319959/…。
@Cristik 是的,我将 NSObject 子类化,因此它已经实现了 Equatable。这可能是问题所在。我会试试 Martin R 的建议。【参考方案2】:
我会更具体地说明您正在测试的内容。
平等和身份不是一回事,尤其是在 Swift 中,值类型要丰富得多。
如果您想测试符合Equatable
定义的相等性,请使用:
XCTAssertTrue(a == b)
如果要测试两个引用类型是否相等:
XCTAssertTrue(a === b)
我觉得这样更好,因为断言更明确;对象是否相等或相同。
记住 WWDC15 上有关 Swift 中的值类型的会议 - 它建议始终使您的值类型符合 Equatable
。
【讨论】:
以上是关于XCTAssertEqualObjects 的替代品是啥?的主要内容,如果未能解决你的问题,请参考以下文章