gpt4 book ai didi

ios - 为什么 Travis 找不到我的头文件? (当相同的指令在我的本地 Xcode 上运行良好时)

转载 作者:可可西里 更新时间:2023-11-01 04:50:07 26 4
gpt4 key购买 nike

我的 Cocoapod 的 lib 项目在 Travis 上的测试失败,因为测试目标似乎无法找到 Pod 的来源之一:

'XYZMyClass.h' file not found

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

  • 图像是 osx_image: xcode8 for 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

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

PS:源代码在 GitHub 上可用 here Travis 版本是 here .

谢谢!

最佳答案

问题的根源在于你的BSGMetrics.podspec

安装 pod 后,这些 header 会公开:

  s.public_header_files = [
'BSGMetrics/Classes/BSGMetrics.h',
'BSGMetrics/Classes/BSGMetricsConfiguration.h',
'BSGMetrics/Classes/BSGMetricsEvent.h'
]

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

#import "BSGMetricsEvent.h"
#import "BSGMetricsService.h"

如果该服务旨在成为私有(private) header ,您将无法使用这种安装方式对其进行测试 - 通过带有测试目标的示例项目以及将您的 pod 安装为 pod。

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

无论如何,这里最简单的解决方法是将 BSGMetricService 公开到 s.public_header_files

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

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

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

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

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

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

其次,测试仅在测试包内完成,没有主机应用程序。 enter image description here

第三,在测试目标中也加入被测文件进行编译。

长话短说,测试和被测代码位于同一个模块中。

可能会发现更多阅读 here

关于ios - 为什么 Travis 找不到我的头文件? (当相同的指令在我的本地 Xcode 上运行良好时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com