为什么Travis找不到我的头文件?(当我的本地Xcode上相同的指令正常运行时)

Dir*_*nry 5 objective-c ios travis-ci cocoapods xcode8

我的Cocoapod的lib项目未能对Travis进行测试,因为测试目标似乎无法找到Pod的一个来源:

'XYZMyClass.h' file not found
Run Code Online (Sandbox Code Playgroud)

在我的开发环境中,我可以运行相同的命令Travis成功运行并且环境设置相同:

  • 图像osx_image: xcode8用于Travis,我也在本地使用Xcode 8.0
  • Travis失败但在本地成功运行的指令如下:

    set -o pipefail && xcodebuild -workspace Example/XYZMyPod.xcworkspace -scheme XYZMyPod-Example -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6s,OS=9.3' test | xcpretty
    
    Run Code Online (Sandbox Code Playgroud)

甚至更奇怪,'XYZMyClass.h'是我的源文件导入中的第二个导入.为什么第一个工作正常?它们属于同一目标,具有相同的可见性(Public).

PS:源可以在GitHub 这里和特拉维斯构建是在这里.

谢谢!

Pet*_*nev 1

问题的根源在于你BSGMetrics.podspec

安装 pod 后,这些标头将公开:

  s.public_header_files = [
    'BSGMetrics/Classes/BSGMetrics.h',
    'BSGMetrics/Classes/BSGMetricsConfiguration.h',
    'BSGMetrics/Classes/BSGMetricsEvent.h'
  ]
Run Code Online (Sandbox Code Playgroud)

这就是为什么在您的测试类中您能够看到第一次导入而无法看到第二次导入。

#import "BSGMetricsEvent.h"
#import "BSGMetricsService.h"
Run Code Online (Sandbox Code Playgroud)

如果该服务旨在成为私有标头,则您将无法使用这种安装来测试它 - 通过带有测试目标的示例项目以及作为 pod 安装的 pod。

相反,您需要将 pod 文件添加到项目的主目标或测试目标(我建议测试,而不是主目标)。

无论如何,这里最简单的解决方法是BSGMetricServices.public_header_files

编辑(测试方法的描述):

诀窍在于如何对待单元测试。将 BSGMetrics 视为“模块”,一个黑匣子。它有一些“可见”的接口和一些隐藏的实现细节。对于 Objective-C 和 Swift 来说都是如此。不同之处在于用于定义模块实体可见性的语言工具。在 Objective-C 中是头文件。在 Swift 中是public, private,internal修饰符(Swift 3.0 之前)

因此,除非您在测试时将 BSGMetrics 视为模块,否则您将无法访问/测试您的实现细节。您只能通过可用的接口对其进行测试。

是好是坏?不一定,一切都取决于你需要什么。但是,如果您期望[BSGMetrics openWithConfiguration:]初始化实例BSGMetricsService,则您需要BSGMetricsService对测试范围可见。有两种方法:make 可见(您现在使用的方式)或合并模块和测试的范围。

我将描述一下如何实现后一种方法来测试我的一个库。

首先,测试目标是同一项目的一部分,其中也添加了所有被测试的文件。

其次,测试仅在测试包内完成,没有主机应用程序。 在此输入图像描述

第三,被测试的文件也被添加到测试目标中进行编译。

长话短说,测试和测试中的代码驻留在同一个模块中。

更多阅读内容可以在这里找到