最近我花了很长时间才弄明白我的单元测试问题。我在单元测试中看到的错误是:
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"
}
}
}
AssetIdentifier
是UIImage
扩展名
我尝试了以下列出的建议:
但是,它会在控制器上返回一个不同的错误:
'AssetIdentifier' is inaccessible due to 'internal' protection level
我试图清理并重建但它返回相同的错误。
答案 0 :(得分:2)
我认为您的问题在于模块module
的双重导入。
import module
@testable import module
通过导入两次,您可以为编译器提供module
中定义的每种类型和函数的两个(相同)版本。这就是为什么它抱怨AssetIdentifier
的含糊不清,其中有两个,它不知道要选哪个。
正确的做法是删除import module
。
@testable import
语句允许您导入测试目标中的模块,并可以访问定义的internal
类型和函数以及public
。
将
@testable
属性添加到已启用测试时编译的模块的import语句时,将激活该范围内该模块的提升访问权限。标记为内部或公共的类和类成员的行为就像它们被标记为打开一样。标记为内部的其他实体就像宣布公开一样。
如果你这样做,你会发现你不会有歧义问题而且你不需要在测试目标中移动UIImage
扩展名。正如@JonReid在他的comment中明确指出的那样“生产代码应保留在您的生产目标中”。
希望这有帮助。
答案 1 :(得分:0)
虽然该主题没有给出真正的答案,但它提供了很好的线索。所以我找到的解决方法是删除:
@testable import module
我将UIImage扩展保留在测试模块中,因此编译器不会抱怨。