使用 Cocoapods 进行 Xcode 单元测试

在过去的几天里,我一直在用这个东西撞墙,但是尽管我在 Google/SO/Github 上进行了多次搜索,我还是找不到解决问题的方法!

我所要做的就是为我的应用程序创建一些单元测试,这些单元测试使用了 Firebase pods。

我使用的是 Xcode 7.3.1和 Cocoapods 1.0.1。 Xcode 8.0仍然存在 更新:问题

在这个 podfile 里:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!


target 'MyApp' do
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'


target 'MyAppTests' do
inherit! :search_paths
end
end

在我的 XCTest 课上

缺少所需模块‘ Firebase’

@testable import MyApp错误

或者使用这个 podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!


def common_pods
pod 'SwiftyTimer'
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
end


target 'MyApp' do
common_pods
end


target 'MyAppTests' do
common_pods
end

测试构建了,但是我的控制台上到处都是警告,例如:

Class <-FirebaseClassName-> 在... MyApp... 和 ... 我的应用测试... 其中一个将被使用。哪一个是未定义的

45137 次浏览

我也遇到了同样的问题。我通过将 pod 'Firebase'移动到我的测试目标来解决这个问题。把你的 Podfile 改为:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!


target 'MyApp' do
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'


target 'MyAppTests' do
inherit! :search_paths
pod 'Firebase'
end
end

问题是在 CocoaPods 为设置生成自己的值之后,Firebase 对 Header Search Path 做了一些特殊的处理,这样 CocoaPods 就不会为了将其传递给测试目标而接收这个变化。你可以用两种方法解决这个问题:

  1. 在文件导航器中找到 MyAppTests.<configuration>.xcconfig,并将以下内容添加到 HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources[ * ]

  2. 在“生成设置”中查找 标题搜寻路径的设置,并向列表中添加与选项1相同的值。您不应该将其设置为递归的。

* 根据 AKM 的评论,这在3.14.0版本中改为 ${PODS_ROOT}/Firebase/Core/Sources

我的解决方案是将 cocoapods 更新到1.1.0. rc.2版。

sudo gem install cocoapods --pre

我也有过类似的问题。根据你的问题,我将我的 MyApp.<configuration>.xcconfig文件的内容复制到我的 MyAppTests.<configuration>.xcconfig文件。我清理并建立了测试,它起作用了。

尝试将继承更改为 :complete,如下所示:

target 'MyAppTests' do
inherit! :complete
end

重要的是,它允许任何其他人检查你的回购只是做一个 pod update一如既往,而不必复制 .xcconfig文件或其他黑客只是建立。

仅将 “ ${ PODS _ ROOT }/Firebase/Core/Source”添加到 构建设置 -> < strong > 头部搜索路径

这个问题记录在这里的消防基地项目中:

Https://github.com/firebase/firebase-ios-sdk/issues/58

有一个解决办法:

仅向测试目标添加“ ${ PODS _ ROOT }/Firebase/Core/Source” 在「建置设定」下-> 标头搜寻路径

但是这个问题也可以通过升级到 CocoaPods 1.4.0或更高版本来解决,这是一个更好的解决方案。

在我写这篇文章的时候(2017年11月) ,cocoapods 1.4.0还处于 beta 测试阶段,所以要安装它,你需要明确地请求 beta 测试:

gem install cocoapods --pre

然后做一个 pod install解决了运行我的测试的问题。

开始工作前的三个步骤:

Cocopods: 1.5.0 Swift 4 Firebase: 4.13.0

第一步: 确保将以下目标块添加到您的 podfile 中。

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'


target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!


# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'


target 'TIMIITests' do
inherit! :search_paths
pod 'Firebase/Core'
end


end

第二步: 在 YourAppTestsProjectNavigatorBuild 设置选项卡中。查找 Header Search Path 行并将下面一行添加到 Debug

$(继承) ${ PODS _ ROOT }/Firebase/Core/Source

第三步: 终点站:

分离舱更新

正如 @ Will在 CocoaPods 安装后提到的有关 标题搜寻路径的一个问题。

我有一个项目与多个目标,其中吊舱’Firebase’嵌入到单独的模块,让我们说 MyProject-Shared。“ Podfile”上的 Firebase pod 只为“ MyProject-Shared”目标安装。其他想要使用“ MyProject-Shared”的模块由于错误无法编译:

“失踪的所需模块‘火力基地’”

在我的例子中,诀窍是在 每个人目标的 生成设置引用 分析-架构时添加以下缺失的头搜索路径:

“ ${ PODS _ ROOT }/Firebase/CoreOnly/Source”

请看下面的图片: Header Search Path

希望能节省你的时间。

  1. 选择单元测试目标设置。
  2. 转到生成设置。
  3. 查找页眉搜索路径。
  4. 使用递归方法添加此值 $(SRCROOT)/Pods,然后 Xcode 将为您解析路径。

这里是 例子

我尝试了以上所有的方法,然后遇到了各种不同的错误,最初是从 Missing required module 'Firebase'开始的,然后如果我试图将 Firebase Pods 添加到我的测试目标中,就会出现 "Class ... is implemented in both ... "或链接器问题。

对我有效的解决办法是:

  1. 将测试目标完全从 Podfile 移除,并运行“ pod update”以确保 XCode 项目同步。
  2. 打开我的测试目标的构建设置,并更新头部搜索路径,只包括以下3个项目:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

此时清理构建文件夹,然后重新构建,然后重新运行测试对我来说很有用。希望这对某些人有帮助!

${SRCROOT}/Pods/Firebase/CoreOnly/Sources添加到单元测试目标的“ Header 搜索路径”中修复了这个问题。 步骤:

  1. 选择你的 单元测试目标单元测试目标
  2. 转到 生成设置
  3. 搜索 头部搜索路径头部搜索路径
  4. 加入 ${ SRCROOT }/Pods/Firebase/CoreOnly/Source

enter image description here

在此之后,测试可以运行,错误将消失。

无可可豆解决方案

对于那些遇到同样问题但没有使用 CocoaPods 的人:

如果你使用 Firebase,那么你有一些包含 Firebase.hmodule.modulemap文件的文件夹

如果 Main 项目目标工作方式正确,那么应该转到 ProjectSettings-> Targets。选择测试目标。搜索 User headers并添加到 YOUR_PROJECT_DIR/Linking的路径。选择 recursive选项,你应该是好去。

有关更多细节,请参见截图:

enter image description here

一种更简单的方法同样有效:

target 'MyApp' do
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'


target :MyAppTests
end