【问题标题】:Xcode Unit Testing with Cocoapods使用 Cocoapods 进行 Xcode 单元测试
【发布时间】:2016-11-08 00:54:27
【问题描述】:

在过去的几天里,我一直在为此苦苦挣扎,但是尽管进行了多次 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

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

Class 在 ...MyApp... 和 ...MyAppTests... 将使用两者之一。哪个是未定义的

【问题讨论】:

  • 我只使用 Firebase Analytics。迁移到 Google 分析后,一切都像魅力一样发挥作用。
  • 我自己还没有尝试过,但我可能会尝试手动包含 Firebase,而不是使用可可豆荚:firebase.google.com/docs/ios/setup#frameworks
  • 这仍然是个问题

标签: ios xcode unit-testing cocoapods xctest


【解决方案1】:

一个更简单的方法:

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

    target :MyAppTests
end

【讨论】:

  • 这非常有效。谢谢你。有关语法的任何文档? : MyAppTests 是什么意思?
  • 这也适用于我,语法看起来最简单!
【解决方案2】:

Missing required module FirebaseNO CocoaPods 解决方案

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

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

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

查看截图了解更多详情:

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 这对我有用。无需触摸 podfile 或 xcconfig。感谢分享。
    【解决方案4】:

    我尝试了以上所有方法并遇到了各种不同的错误,最初以 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

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

    【讨论】:

    • 在尝试了此线程上的所有其他内容之后 - 这是让事情对我有用的唯一答案。谢谢!
    【解决方案5】:
    1. 选择您的单元测试目标设置。
    2. 转到构建设置。
    3. 查找标题搜索路径。
    4. 将此值 $(SRCROOT)/Pods 递归添加,然后 Xcode 将为您解析路径。

    Example

    【讨论】:

    • 谢谢@Kanika Sharma
    【解决方案6】:

    正如@Will 提到在 CocoaPods 安装后围绕 Header Search Paths 的问题。

    我有一个包含多个目标的项目,其中 pod 'Firebase' 嵌入到单独的模块中,比如说MyProject-Shared。仅为“MyProject-Shared”目标安装了“Podfile”中的 Firebase pod。由于错误,无法编译其他想要使用“MyProject-Shared”的模块:

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

    在我的例子中,诀窍是在 each 目标的 Build Settings 中添加以下缺少的标头搜索路径,并引用 Analytics-Framework: p>

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

    请看下图:

    希望它能节省您的时间。

    【讨论】:

      【解决方案7】:

      问题记录在这里的firebase项目中:

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

      有一个解决方法:

      仅将“${PODS_ROOT}/Firebase/Core/Sources”添加到您的测试目标 在 Build Settings -> Header Search Paths 下

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

      在我写这篇文章时(2017 年 11 月)cocoapods 1.4.0 仍处于测试阶段,因此要安装它,您需要明确请求测试版:

      gem install cocoapods --pre
      

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

      【讨论】:

      • 什么是“PODS_ROOT”??
      • @ArgaPK 是 cocoapods 设置的变量。只需将我在“”之间写的内容准确地粘贴到 Xcode 中。最好的方法是将 CocoaPods 升级到 >= 1.4.0。
      • @JosephH 将我的 cocoapods 更新到 1.5.2 并没有解决问题,不幸的是。
      • @AnastasiaKovaleva 升级后你运行pod install 了吗?
      • @JosephH Running pod install 解决了我的问题!非常感谢!
      【解决方案8】:

      三个步骤才能让这个工作:

      CocoaPods:1.5.0 斯威夫特 4 火力基地: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 选项卡中。找到 Header Search Path 行并添加到 Debug 以下行

      $(inherited) ${PODS_ROOT}/Firebase/Core/Sources

      第 3 步: 在终端运行中:

      吊舱更新

      【讨论】:

        【解决方案9】:

        仅将 "${PODS_ROOT}/Firebase/Core/Sources" 添加到您的测试目标中 构建设置 -> 标题搜索路径

        【讨论】:

        • 这是什么? PODS_ROOT
        • 它将获取 pod 的目录
        【解决方案10】:

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

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

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

        2. 在 Build Settings 中找到 Header Search Paths 的设置,并将与选项 1 中相同的值添加到列表中。您不需要将其设置为递归。

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

        【讨论】:

        • 试过了,但仍然收到相同的警告
        • 自 Firebase 3.14.0 起此解决方案有效,但补丁更改为${PODS_ROOT}/Firebase/Core/Sources
        • 新路径也对我有用!我正在运行 CocoaPods 版本 1.2.0,但请记住,我还必须将 inherit! :search_paths 添加到 Podfile 中的测试目标中。
        • 2.对我不起作用。使用 Firebase 3.x(不是最新的 4.x)
        • 问题可以在这里关注:github.com/firebase/firebase-ios-sdk/issues/58
        【解决方案11】:

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

        target 'MyAppTests' do
            inherit! :complete
        end
        

        重要的是,它允许其他人检查您的存储库,只需像往常一样执行 pod update,而无需复制 .xcconfig 文件或其他黑客来构建。

        【讨论】:

        • 这也有“类...在两者中实现...”问题
        • 它使编译时错误消失,但在运行时导致此错误:clang: error: linker command failed with exit code 1 (use -v to see invocation)
        • 也为我工作!谢谢:)
        【解决方案12】:

        我遇到了类似的问题。根据您的问题,我将MyApp.<configuration>.xcconfig 文件的内容复制到MyAppTests.<configuration>.xcconfig 文件中。我清理并构建了测试,它确实有效。

        【讨论】:

        • 这是唯一对我有用的解决方案。谢谢!我正在考虑在 Podfile 中进行安装后处理
        【解决方案13】:

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

        sudo gem install cocoapods --pre

        【讨论】:

        • 不幸的是它对我不起作用...我必须收回我的赞成票!
        • 对不起,它没有帮助你们,不知道为什么它为我解决了这个问题,而不是你......
        • 我在 1.20,没有运气
        【解决方案14】:

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

        【讨论】:

        • 谢谢,但我刚刚尝试过,但我仍然遇到“Class ... is implemented in both ...”问题。
        • 它对我有用,但对我来说仍然没有意义。这不是我第一次告诉 Firebase 正在奇怪地设置他们的 podspecs,cf。 twitter.com/dirtyhenry/status/836240557311684608 但 Firebase 团队没有回复 :(
        • 进行此更改并没有立即清除警告,但在我运行 pod install 后已解决。
        • 问题解决了一半。另一半通过将“${PODS_ROOT}/Firebase/Core/Sources”添加到您的测试目标仅在 Build Settings -> Header Search Paths 下解决
        • 进行此更改后,不要忘记运行pod install 以更新项目依赖项;)
        猜你喜欢
        • 1970-01-01
        • 2016-02-26
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        相关资源
        最近更新 更多