Swift单元测试中的模糊类型名称

时间:2017-08-26 12:08:32

标签: ios swift unit-testing

最近我花了很长时间才弄明白我的单元测试问题。我在单元测试中看到的错误是:

Ambiguous type name 'AssetIdentifier' in 'UIImage'

这是完整的代码:

import XCTest
import module
@testable import module

class VoucherOptionsViewControllerTests: XCTestCase {
    lazy var result = ""

    class VoucherOptionsViewControllerMock: VoucherOptionsViewController {

        var result = ""

        override func showOverlayView(title: String, message: String, assetIdentifier: UIImage.AssetIdentifier) {
            self.result = "lalalala"
        }
    }
}

AssetIdentifierUIImage扩展名

中的枚举

我尝试了以下列出的建议:

Ambiguous type name error

但是,它会在控制器上返回一个不同的错误:

'AssetIdentifier' is inaccessible due to 'internal' protection level

我试图清理并重建但它返回相同的错误。

2 个答案:

答案 0 :(得分:2)

我认为您的问题在于模块module的双重导入。

import module
@testable import module

通过导入两次,您可以为编译器提供module中定义的每种类型和函数的两个(相同)版本。这就是为什么它抱怨AssetIdentifier的含糊不清,其中有两个,它不知道要选哪个。

正确的做法是删除import module

@testable import语句允许您导入测试目标中的模块,并可以访问定义的internal类型和函数以及public

  

@testable属性添加到已启用测试时编译的模块的import语句时,将激活该范围内该模块的提升访问权限。标记为内部或公共的类和类成员的行为就像它们被标记为打开一样。标记为内部的其他实体就像宣布公开一样。

Source

如果你这样做,你会发现你不会有歧义问题而且你不需要在测试目标中移动UIImage扩展名。正如@JonReid在他的comment中明确指出的那样“生产代码应保留在您的生产目标中”。

希望这有帮助。

答案 1 :(得分:0)

虽然该主题没有给出真正的答案,但它提供了很好的线索。所以我找到的解决方法是删除:

@testable import module

我将UIImage扩展保留在测试模块中,因此编译器不会抱怨。