我为Theme类编写了扩展,该扩展基于当前主题返回了mainColor。我的单元测试涵盖了主题更改,但是UIColor可选值仍然存在问题。我无法解决UIColor无法从我的颜色目录返回我的特定颜色的情况。
extension Theme {
var mainColor: UIColor {
switch self {
case .system:
if let color = UIColor(named: "MainColor") {
return color
} else {
return .clear
}
case .custom:
return .yellow
}
}
}
我也使用了这一行而不是解开可选的内容,但是它也没有用。
return UIColor(named: "MainColor") ?? .clear
我如何对从资产目录中检索到正确的颜色进行单元测试?
我个人只是在测试中强行打开UIColor(named: "MainColor")!
颜色以断言正在发生的正确行为(我们确实能够访问资产目录中所需的颜色)。如果我们无法访问此颜色,则会发生崩溃,在单元测试上下文中,实际上这是解决所有问题的理想方法。
我还将颜色的名称抽象为enum
以确保仅在1个地方定义该名称,然后消除了在应用程序目标与测试目标之间命名不一致的可能性。
enum Colors: String {
case main = "MainColor"
}
然后使用UIColor(named: Colors.main.rawValue)
访问颜色。
问题是MainColor这个名称是硬编码的,而且该颜色在您的资产目录中还是不在您的资产目录中,因此您无法在测试中控制该颜色。您需要将其抽象为一种方法,可以将测试中的颜色名称传递给该方法。