【问题标题】:XCTAssertEqual for custom objects in SwiftXCTAssertEqual 用于 Swift 中的自定义对象
【发布时间】:2014-08-16 16:22:05
【问题描述】:

XCode 6,测试版 5

我有一个这样的单元测试:

函数 testMyObjectsEqual() { //.... XCTAssertEqual(myObject, myOtherObject, "\(myObject) 和 \(myOtherObject) 应该相等") }

XCTAssertEqualObjects 在 Swift 中不再可用,因为该语言不区分标量和对象。

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

 "Type MyObject 不符合 Equatable 协议"

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

 XCTAssert(myObject == myOtherObject, "\(myObject) 和 \(myOtherObject) 应该相等")

所以我的问题是:有没有办法(从 beta 5 开始)将 XCTAssertEqual 用于自定义类型,而不必依赖 NSObject 或使用“==”重载乱扔所有自定义类型?

【问题讨论】:

  • 我问了一个类似的问题,我想知道它可能是重复的。请参阅stackoverflow.com/questions/34764509/… 从我可以看到 XCTAssertEquals 不会触发 == 等价运算符。而对于自定义类,它只为对象引用相等返回 true

标签: ios unit-testing swift


【解决方案1】:

如果你想在 Swift 中比较引用,你可以使用 === 操作符。当您从 NSObject 子类化时会发生这种情况(当您在 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
}

我想当您比较自定义对象时,您可能应该使它们符合 Equatable 协议并指定您的自定义对象何时相等(在以下情况下,当它们具有相同名称时对象相等):

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
}

【讨论】:

  • 在比较自定义对象时,Apple 明确表示,决定两个实例何时相等的责任落在了开发人员身上。这就是他们引入 Equatable 协议的原因。但是,在比较引用类型的标识时,我们需要按照您的建议使用 === 运算符。我的问题是我们不能以这种方式使用 XCTAssertEqual。
  • 在我看来,缺少一个“XCTAssertSame”函数,它可以比较对象的相等性。不过写起来很容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2019-12-13
相关资源
最近更新 更多