简体   繁体   English

Swift单元测试 - 如何断言CGColor是它应该是什么?

[英]Swift Unit test- How do I assert that a CGColor is what it's supposed to be?

Using Xcode V7.2. 使用Xcode V7.2。 Trying to unit test, need to verify that the correct color has been set, and get this message: 尝试进行单元测试,需要验证是否已设置正确的颜色,并收到以下消息:

Cannot invoke 'XCTAssertEqual' with an argument list of type '(CGColor, CGColor)'

How do I assert that a CGColor is what it's supposed to be? 我怎么断言CGColor是它应该是什么?

使用XCTAssert并测试CGColorEqualToColor是否为true。

As of Swift 3.0 / Xcode 8.0 CGColorEqualToColor also no longer works, it results in the error "CGColorEqualToColor is unavailable: use == instead". 从Swift 3.0 / Xcode 8.0开始CGColorEqualToColor也不再有效,导致错误“CG​​ColorEqualToColor不可用:使用==代替”。

== or isEqual has the limitation that it: ==或isEqual有以下限制:

will return NO[/False] when comparing colors that are in different models/spaces (for instance #FFF with [UIColor whiteColor]) 比较不同模型/空格中的颜色时会返回NO [/ False](例如#FFF与[UIColor whiteColor])

(From this SO answer ) which may not be the desired behaviour. (从这个SO答案 )可能不是所希望的行为。

It is cumbersome, but I break the colour down into its R/G/B/Alpha components and compare those, eg: 这很麻烦,但我将颜色分解为R / G / B / Alpha组件并进行比较,例如:

    var red1:CGFloat=0, green1:CGFloat=0, blue1:CGFloat=0, alpha1:CGFloat=0
    colour1.getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

    var red2:CGFloat=0, green2:CGFloat=0, blue2:CGFloat=0, alpha2:CGFloat=0
    colour2.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

    XCTAssertEqual(red1, red2)
    XCTAssertEqual(green1, green2)
    XCTAssertEqual(blue1, blue2)
    XCTAssertEqual(alpha1, alpha2)

EDIT: (adding this to your answer instead of creating a new answer :) 编辑:(将此添加到您的答案,而不是创建一个新的答案:)

Here's a UIColor extension for easier use: 这是一个UIColor扩展,更容易使用:

import UIKit

extension UIColor {
    func isEqualTo(_ color: UIColor) -> Bool {
        var red1: CGFloat = 0, green1: CGFloat = 0, blue1: CGFloat = 0, alpha1: CGFloat = 0
        getRed(&red1, green:&green1, blue:&blue1, alpha:&alpha1)

        var red2: CGFloat = 0, green2: CGFloat = 0, blue2: CGFloat = 0, alpha2: CGFloat = 0
        color.getRed(&red2, green:&green2, blue:&blue2, alpha:&alpha2)

        return red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2
    }
}

and use it like this: 并像这样使用它:

XCTAssertTrue(cell.backgroundColor!.isEqualTo(.clear))

OR - you can use an Equatable function 或者 - 您可以使用Equatable函数

func ==(lhs: UIColor, rhs: UIColor) -> Bool {
    var lr: CGFloat = 0, lg: CGFloat = 0, lb: CGFloat = 0, la: CGFloat = 0
    lhs.getRed(&lr, green:&lg, blue:&lb, alpha:&la)
    var rr: CGFloat = 0, rg: CGFloat = 0, rb: CGFloat = 0, ra: CGFloat = 0
    rhs.getRed(&rr, green: &rg, blue: &rb, alpha: &ra)
    return lr == rr && lg == rg && lb == rb && la == ra
}

and use it like this: 并像这样使用它:

XCTAssertTrue(cell.backgroundColor == UIColor.clear)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何返回Unmanaged <CGColor>!在斯威夫特 - How do I return an Unmanaged<CGColor>! in Swift 在单元测试中对 UIImage 断言的最佳方法是什么? - What's the best way to assert on a UIImage in a unit test? 如何使用Swift单元测试NSFetchedResultsControllerDelegate(controllerWillChangeContent和controllerDidChangeContent) - How do I unit test NSFetchedResultsControllerDelegate (controllerWillChangeContent and controllerDidChangeContent) using Swift 我如何断言在单元测试中调用了委托 - How can I assert a delegate is called in my unit test 如何在swift 4中比较两个CGColor - how to Compare two CGColor in swift 4 如何在带有CGGradient的NSArray中轻松使用CGColor - How do I comfortably use CGColor in an NSArray with CGGradient 如何从Swift单元测试中访问测试目标中存在的Objective-C代码? - How do I access Objective-C code that exists in the test target, from a Swift unit test? 使用 Monotouch 时如何将 CGColor 转换为 NSObject? - How do I convert a CGColor into an NSObject when using Monotouch? 测试prepareForSegue是否符合预期的方法 - a way to test if prepareForSegue does what it's supposed to 如何对openWithCompletionHandler进行单元测试 - How do I unit test openWithCompletionHandler
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM