使用Cocoapods的Xcode单元测试

问题描述 投票:102回答:13

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

[我要做的就是为我的应用程序创建一些使用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类中,我得到

缺少必需的模块'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 在... MyApp ...和... MyAppTests ...将使用两者之一。哪一个未定义

ios xcode unit-testing cocoapods xctest
13个回答
77
投票

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

1
投票

添加“ $ {PODS_ROOT} / Firebase / Core / Sources”仅在构建设置-> 标题搜索路径


1
投票

@Will所述,在CocoaPods安装之后,有关Header Search Paths的问题。

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

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

在我的情况下,诀窍是在每个目标的构建设置上引用以下Analytics-Framework]:]添加以下缺少的标题搜索路径:

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

请参见下面的图片:Header Search Path

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

${SRCROOT}/Pods/Firebase/CoreOnly/Sources添加到单元测试目标的“标题搜索路径”中,此问题已解决。步骤:

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

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

    [Missing required module Firebase否CocoaPods解决方案

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

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

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

    请参见屏幕快照以获取更多详细信息:

    enter image description here


    0
    投票

    ${SRCROOT}/Pods/Firebase/CoreOnly/Sources添加到单元测试目标的“标题搜索路径”中,此问题已解决。步骤:


    0
    投票

    [Missing required module Firebase否CocoaPods解决方案


    53
    投票

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

    target 'MyAppTests' do
        inherit! :complete
    end
    

    重要的是,它允许其他任何人签出您的存储库,像往常一样执行pod update,而不必复制.xcconfig文件或其他仅用于构建的黑客工具。


    43
    投票
    1. 选择您的单元测试目标设置。
    2. 转到构建设置。
    3. 查找标题搜索路径。
    4. 以递归方式添加此值$(SRCROOT)/ Pods,然后Xcode将为您解析路径。

    Example


    33
    投票

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

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

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

    2. 在“构建设置”中找到Header Search Paths的设置,并将与选项1相同的值添加到列表中。您无需将其设置为递归。

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


    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解决了运行测试的问题。


    6
    投票

    我可以先完成此工作的三个步骤:

    CocoaPods:1.5.0斯威夫特4Firebase: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项目导航器的“构建设置”选项卡中。找到“标题搜索路径”行,并添加到“调试”以下行

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

    步骤3:在终端运行:

    pod更新


    3
    投票

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

    sudo gem install cocoapods --pre


    3
    投票

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

    对我有用的解决方案是:

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

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


    2
    投票

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

    © www.soinside.com 2019 - 2024. All rights reserved.