我在 NSURL 上编写了以下类扩展:
extension NSURL
{
var linkComponents: LinkComponents
{
var pathComponents = self.pathComponents ?? []
if let first = pathComponents.first where first == "/"
{
pathComponents.removeFirst()
}
return LinkComponents(components: pathComponents)
}
var linkPath: String
{
return self.path ?? ""
}
}
它包含一个计算的(仅获取)属性:
var linkComponents: LinkComponents
当我尝试在我的单元测试目标中测试这个计算属性时,编译器会抛出错误Ambiguous use of 'linkComponents'
并建议一些“候选人”。
这似乎是一个访问控制问题。我的测试文件中的导入语句有@testable
注释。我的所有其他测试(对于非计算属性)都可以编译,无需我指定任何超出默认值的访问控制internal
。如果我将这个特定的计算属性转换为一个函数,那么测试目标就会编译 a-ok。
是否可以在 Swift 中对计算属性进行单元测试?如果是这样,怎么做?不用说(1)我不想将此计算属性转换为函数,并且(2)我不想添加public
到所有内容中。
编辑 1
编译器建议的“候选人”实际上只是一个“候选人”,它是我的计算属性。即编译器正确识别计算属性,但它不会正式将其识别为唯一有效的候选者。
编辑 2
实际上,将其转换为函数也不起作用。鉴于我正在从我编写的类的扩展中测试函数。也许这与 Foundation 类的扩展中的测试功能有关(如本例中的 NSURL)。
编辑 3
经过进一步调查,看起来这是由于计算属性的返回类型 ( LinkComponents
) 。linkComponents
编译器不喜欢这样。如果我将返回类型更改为String
它就可以了。如果我LinkComponents
在测试用例本身或在计算属性的主体中引用类型的对象,它也可以。只有当计算属性的类型是LinkComponents
编译器抱怨时。这里是LinkComponents
:
enum LinkComponents
{
case None
case Any(String, String?, String?, String?, String?)
init(components: [String])
{
switch components.count
{
case 0:
self = .None
case 1:
self = .Any(components[0], nil, nil, nil, nil)
case 2:
self = .Any(components[0], components[1], nil, nil, nil)
case 3:
self = .Any(components[0], components[1], components[2], nil, nil)
case 4:
self = .Any(components[0], components[1], components[2], components[3], nil)
case 5:
self = .Any(components[0], components[1], components[2], components[3], components[4])
default:
self = .Any(components[0], components[1], components[2], components[3], components[4])
}
}
}