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) @MaxMacLeod XCTAssertEquals 确实使用了相等运算符。也许问题出在代码的其他地方。 @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 的替代品是啥?的主要内容,如果未能解决你的问题,请参考以下文章

ETF替代规则

替代拉链的替代方式

python实现替代密码与置换密码

Markdown 替代品 Asciidoc 介绍

C# 中怎么应用JSON来替代之前的webservice??

如何强制MonoDevelop的建设使用替代单安装