使用Cocoapods的Xcode单元测试


119

最近几天,我一直在用这种方法撞墙,但是尽管进行了多次Google / SO / Github搜索,但我找不到解决所遇到问题的方法!

我要做的就是为我的应用程序创建一些单元测试,以利用Firebase Pod。

我正在使用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

测试建立,但是我的控制台上满是警告,例如:

类<-FirebaseClassName->在... MyApp ...和... MyAppTests ...中都实现。将使用两者之一。哪一个未定义


我只在使用Firebase Analytics。迁移到Google Analytics(分析)后,一切都变得像个魅力。
marosoaie

我尚未尝试过自己,但我可能会尝试不使用可可豆荚手动添加Firebase:firebase.google.com/docs/ios/setup#frameworks
Jonny

1
这仍然是一个问题
Edward

Answers:


84

我遇到过同样的问题。我通过转到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

谢谢,但是我只是尝试了一下,但仍然遇到“类...在两个中都实现了”的问题。
2016年

1
它对我有用,但对我来说仍然没有意义。这不是我第一次告诉Firebase奇怪地设置其podspec的情况,请参阅。twitter.com/dirtyhenry/status/836240557311684608,但Firebase团队未回复:(
肮脏的亨利

4
进行此更改并没有立即清除警告,但在我运行后已解决pod install
blwinters

解决了一半问题。另一半通过仅在“构建设置”->“标题搜索路径”-ArgaPK中,将“ $ {PODS_ROOT} / Firebase / Core / Sources”添加到“ Tests”目标中来解决
-ArgaPK

进行此更改后,请不要忘记运行pod install以更新项目依赖项;)

56

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

target 'MyAppTests' do
    inherit! :complete
end

重要的是,它使其他任何签出您的存储库的用户都pod update可以照常进行,而不必复制.xcconfig文件或其他黑客工具即可构建。


1
这也有“类...都在...中实现”的问题
Diogo T

它使编译时错误消失,但在运行时导致此错误:clang:错误:链接程序命令失败,退出代码为1(使用-v查看调用)
CMont

也为我工作!谢谢:)
smapps 17-10-25


34

问题在于,在CocoaPods为其设置生成自己的值之后,Firebase在标头搜索路径中做了一些特殊的事情,因此CocoaPods不会接受此更改以将其传递到测试目标。您可以通过以下两种方法之一解决此问题:

  1. 找到MyAppTests.<configuration>.xcconfig文件导航器,然后将以下内容添加到HEADER_SEARCH_PATHS

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

  2. 在“构建设置中找到“ 标题搜索路径 ”的设置,并将与选项1相同的值添加到列表中。您无需将其设置为递归。

*根据AKM的评论,此内容已${PODS_ROOT}/Firebase/Core/Sources在3.14.0版中更改为


尝试过但仍收到相同的警告
2016年

8
从Firebase 3.14.0版本开始,此解决方案有效,但是补丁更改为${PODS_ROOT}/Firebase/Core/Sources
AKM

1
新的道路也为我工作!我正在运行CocoaPods 版本1.2.0,但是请记住,我还必须在中添加inherit! :search_paths测试目标Podfile
Paulo Mattos

2.对我不起作用。使用Firebase 3.x(不是最新的4.x)
Jonny


7

在使此工作之前,需要执行三个步骤:

CocoaPods:1.5.0 Swift 4 Firebase:4.13.0

步骤1:确保将以下目标块添加到您的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

步骤2:在YourAppTests Project Navigator Build Settings标签中。找到“标题搜索路径”行,并添加到“调试”下一行

$(继承)$ {PODS_ROOT} / Firebase / Core / Sources

步骤3:在终端运行中:

吊舱更新


7

该问题记录在firebase项目中:

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

有一种解决方法:

仅在“构建设置”->“标题搜索路径”下,将“ $ {PODS_ROOT} / Firebase / Core / Sources”添加到测试目标

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

在撰写本文时(2017年11月),cocoapods 1.4.0仍处于beta版本,因此要安装它,您需要明确要求beta版本:

gem install cocoapods --pre

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


1
什么是“ PODS_ROOT”?
ArgaPK

@ArgaPK这是cocoapods设置的变量。只需将我在“”之间写的内容完全粘贴到Xcode中即可。真正最好的方法是将CocoaPods升级到> = 1.4.0。
JosephH 17/12/22

1
不幸的是,@ JosephH将我的cocoapods更新为1.5.2并没有解决问题。
史黛西·史密斯

@AnastasiaKovaleva pod install升级后运行吗?
JosephH '18

@JosephH Running pod install解决了我的问题!非常感谢!
史黛西·史密斯

4

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

sudo gem install cocoapods --pre


不幸的是,这对我不起作用...我必须收回我的投票!
Zeb

抱歉,这对您没有帮助,不知道为什么它为我而不是您解决了问题……
doovers 2016年

我现在1.20,没有运气
UKDataGeek

4

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

对我有用的解决方案是:

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

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


在该线程上尝试了所有其他方法之后,这是使事情对我有用的唯一答案。谢谢!
阿里·帕尔

4

添加${SRCROOT}/Pods/Firebase/CoreOnly/Sources到固定的问题单元测试目标的“部首搜索路径”。脚步:

  1. 选择您的单元测试目标
  2. 转到构建设置
  3. 搜索标题搜索路径
  4. 添加$ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

在此处输入图片说明

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


2

我有一个类似的问题。关于您的问题,我将MyApp.<configuration>.xcconfig文件的内容复制到MyAppTests.<configuration>.xcconfig文件中。我清理并构建了测试,并且可以正常工作。


这是唯一对我有用的解决方案。谢谢!我正在考虑在Podfile中执行安装后处理
-SauloT


1

正如@Will提到的那样,安装CocoaPods之后出现了与标题搜索路径有关的问题。

我有一个具有多个目标的项目,可以将pod“ Firebase”嵌入到单独的模块中MyProject-Shared。仅针对“ MyProject-Shared”目标安装了“ Podfile”上的Firebase Pod。想要使用“ MyProject-Shared”的其他模块由于错误而无法编译:

'缺少必需的模块“ Firebase”'

我的诀窍是在每个目标的“ 构建设置”中添加以下缺少的标题搜索路径,以引用Analytics-Framework

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

请参见下面的图片: 标头搜索路径

希望它可以节省您的时间。


1

一个更简单的方法也有效:

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

    target :MyAppTests
end

0

Missing required module Firebase 没有CocoaPods解决方案

对于那些遇到相同问题但不使用CocoaPods的人:

如果您使用的是Firebase,那么您将有一些包含Firebase.hmodule.modulemap文件的文件夹。例如 -YOUR_PROJECT_DIR/Linking

如果主项目目标的工作方式正确,则应转到ProjectSettings-> Targets。选择测试目标。搜索User headers并将路径添加到YOUR_PROJECT_DIR/Linking。选择recursive选项,您应该会很好。

有关更多详细信息,请参见屏幕截图:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.