2016-07-06 189 views
61

过去几天里,我一直在用这种方式将我的头撞在墙上,但尽管有多个Google/SO/Github搜索,我无法找到解决我遇到的问题的解决方案!使用Cocoapods进行Xcode单元测试

我想要做的是为我的应用程序创建一些单元测试,它使用Firebase窗格。

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

Missing required module '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-> is implemented in both ...MyApp... and ...MyAppTests... One of the two will be used. Which one is undefined

+0

我当时只使用Firebase Analytics。在转向Google分析之后,所有事情都像魅力一样。 – marosoaie

+0

我还没有尝试过他自己,但我可能会尝试手动添加Firebase而不使用可可豆荚:https://firebase.google.com/docs/ios/setup#frameworks – Jonny

回答

3

对我来说,解决方案是更新的CocoaPods到版本1.1.0.rc.2。

sudo gem install cocoapods --pre

+0

不幸的是,它不适合我...我必须收回我的upvote! – Zeb

+0

LoL,我不能拿回来... – Zeb

+0

没有为我工作。 – Raphael

42

我有同样的问题。我通过将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 
+0

谢谢,但我刚刚尝试过,但我仍然有“......类......在两个方面都实施”问题。 – doovers

+0

它为我工作,但它仍然没有意义给我。这不是我第一次告诉Firebase奇怪地设置他们的podspecs,参见。 https://twitter.com/dirtyhenry/status/836240557311684608,但Firebase团队没有回复:( –

+1

进行此更改并未立即清除该警告,但在我运行'pod install'后已解决。 – blwinters

30

的问题是,火力地堡做的CocoaPods后一些特别的东西用头搜索路径生成用于设定自己的价值因此,为了实现它的CocoaPods不拿起这种变化超过测试目标。你可以解决两个方面,这一个:

  1. 找到MyAppTests.<configuration>.xcconfig在文件浏览,并添加以下到HEADER_SEARCH_PATHS

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

  2. 查找头搜索路径的设置,然后将相同的值添加到列表中的选项1中。您不需要将其设置为递归。

*按AKM的评论,这个变更为${PODS_ROOT}/Firebase/Core/Sources版本3.14.0

+0

试过,但仍然得到相同的警告 – doovers

+8

从Firebase 3.14.0开始解决方案是有效的,但补丁更改为'$ {PODS_ROOT}/Firebase/Core/Sources' – AKM

+0

@AKM谢谢,新的路径为我工作 – Lope

2

我也有类似的问题。根据您的问题表达,我将我的MyApp.<configuration>.xcconfig文件的内容复制到我的MyAppTests.<configuration>.xcconfig文件中。我清理并构建了测试,并且工作正常。

+0

这是唯一的解决方案,为我工作。谢谢!我正在考虑在Podfile中做一个安装后处理,这样做 – SauloT

28

尝试改变继承:complete,如:

target 'MyAppTests' do 
    inherit! :complete 
end 

重要的是它允许任何人检查出你的回购只是做一个pod update像往常一样,而无需复制.xcconfig文件或其他两轮牛车刚刚建立。

+1

这也有“Class ...在...中实现...”“问题 –

+0

为我工作!谢谢 – cromandini

+0

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

1

添加“$ {PODS_ROOT} /火力地堡/核心/来源”到你的测试只针对下 构建设置 - >头搜索路径

+0

这是什么?PODS_ROOT – ArgaPK

+0

它将获取pod目录 –

4

的问题记录在火力项目在这里:

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

有一种变通方法:

Add "${PODS_ROOT}/Firebase/Core/Sources" to your Tests target only under Build Settings -> Header Search Paths

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

当时我在写这(十一月2017)的CocoaPods 1.4.0仍处于测试阶段,所以要安装它,你需要明确要求测试:

gem install cocoapods --pre 

这解决了这个问题我跑试验。

+0

它是什么“PODS_ROOT”? – ArgaPK

+0

@ArgaPK它是一个可变的cocoapods集,只需粘贴到我写在Xcode之间的东西。最好的方法是将您的CocoaPods升级到> = 1.4.0。 – JosephH

+1

谢谢,现在问题已解决。 – ArgaPK