如何对CocoaPods管理的私有iOS库内部方法做单元测试?
我之前也碰到过一模一样的问题,用pod lib create生成的结构默认确实只能测公开方法,不过有几个靠谱的办法能搞定内部方法的测试:
方法一:用@testable import + 开启测试可访问性
这是最简单的方案,不需要改太多代码:
在测试文件里导入库时加上
@testable
假设你的库叫MyPrivateLib,测试文件开头就这么写:@testable import MyPrivateLib这样测试目标就能访问库中
internal级别的方法(也就是没标记open/public的默认权限方法)。确保库的Build Settings开启测试可访问性
打开私有库的.xcodeproj(不是Example工程的那个),找到库的target,在Build Settings里搜索ENABLE_TESTABILITY,把它设为YES。
这个设置只会在debug模式下让编译器生成允许测试访问内部成员的二进制文件,完全不影响release版本的代码权限。重新安装pod并运行测试
回到Example工程目录,执行pod install,之后就能在测试用例里直接调用内部方法了。
方法二:给测试专用的访问权限(更灵活)
如果有些方法你不想通过@testable全部暴露,或者需要更精准的权限控制,可以用Swift的条件编译来给测试目标单独开权限:
在库的代码里给内部方法加条件访问级别
比如你有个内部方法func internalHelper() -> String,可以改成:#if TESTING internal func internalHelper() -> String #else private func internalHelper() -> String #endif给库的target添加对应编译标志
打开库的.xcodeproj,在库的target的Build Settings里,搜索Other Swift Flags,在Debug模式下添加-D TESTING。这样测试时该方法是internal级别(测试能访问),release时还是private(保持原有封装)。
方法三:调整测试目标的依赖方式(适合复杂场景)
如果上面的方法都不适用,还可以把测试目标直接和库的源码绑定,而非依赖编译好的framework:
- 在Podspec里添加test_spec配置
在你的私有库.podspec文件中,新增一个test_spec块,指定测试源码和依赖,CocoaPods会帮你创建一个和库源码直接绑定的测试target:
执行spec.test_spec 'InternalTests' do |test_spec| test_spec.source_files = 'Tests/Internal/**/*' test_spec.dependency 'MyPrivateLib' endpod install后,这个新的测试target就能直接访问库的所有内部方法了。
注意:第三种方法可能会让测试环境和实际运行环境有细微差异(测试时直接编译源码,而非打包好的framework),所以优先考虑前两种方案。
内容的提问来源于stack exchange,提问作者Andy Meagher

