1

我在 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])
        }
    }
}
4

0 回答 0