带有 AnyObject 参数的通用 XCTAssertEqual?

Posted

技术标签:

【中文标题】带有 AnyObject 参数的通用 XCTAssertEqual?【英文标题】:Generic XCTAssertEqual with AnyObject arguments? 【发布时间】:2016-03-21 22:54:16 【问题描述】:

在测试NSLayoutConstraint 项目时,此行无法编译:

XCTAssertEqual(firstItem, view1)

错误:无法使用“(AnyObject, AnyObject)”类型的参数列表调用“XCTAssertEqual”

为了让它在没有错误或警告的情况下编译,我必须这样做:

XCTAssertEqual(firstItem as? UIView, view1 as? UIView)

但是,我不知道firstItemview1UIView 还是UILayoutSupport,等等。

那么,有没有通用的方法来测试这个?

对于上下文,我在我编写的测试辅助方法中执行此操作:

extension NSLayoutConstraint 
    func assert(item view1: AnyObject, toItem view2: AnyObject? = nil, attribute attr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation = .Equal, attribute attr2: NSLayoutAttribute? = nil, multiplier: CGFloat = 1, constant c: CGFloat = 0) 
        let attribute2: NSLayoutAttribute = view2 == nil ? .NotAnAttribute : (attr2 ?? attr1)
        XCTAssertEqual(firstItem as? UIView, view1 as? UIView)
        XCTAssertEqual(firstAttribute, attr1)
        XCTAssertEqual(self.relation, relation)
        XCTAssertEqual(secondItem as? UIView, view2 as? UIView)
        XCTAssertEqual(secondAttribute, attribute2)
        XCTAssertEqual(self.multiplier, multiplier)
        XCTAssertEqual(constant, c)
    

【问题讨论】:

如果您只是创建了一个函数,该函数在 AnyObject 比较中返回 true 并改用 XCTAssertTrue 怎么办? 谢谢。我搜索了 swift compare anyobject 并找到了答案。 SwiftHamcrest 提供了另一种选择:assertThat(firstItem, sameInstance(view1)) 【参考方案1】:

试试XCTAssertTrue(firstItem === view1)

Swift's identity operator === lets you compare AnyObjects in Swift without casting them to a specific type.

【讨论】:

以上是关于带有 AnyObject 参数的通用 XCTAssertEqual?的主要内容,如果未能解决你的问题,请参考以下文章

找不到接受类型参数列表的 XCTAssertEqual 的重载 ([String : AnyObject], [String : AnyObject])

快速数组无法将“AnyObject”类型的值转换为预期的参数类型@noescape(AnyObject)抛出-> Bool

Alamofire 参数只接受 [String : Anyobject]?

C# 中是不是有带有参数约束的通用构造函数?

带有字符串参数的构造函数的通用约束?

无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”