【问题标题】:How to unit test an app extension on Xcode 6如何在 Xcode 6 上对应用程序扩展进行单元测试
【发布时间】:2014-08-28 22:32:48
【问题描述】:

有谁知道如何对应用扩展目标执行单元测试,尤其是键盘扩展目标?

我尝试了什么(在单元测试目标中):

  • 在“常规”点击中,将其目标设置为扩展目标而不是容器应用。
  • 将“Bundle Loader”设置为扩展目标的二进制文件路径,类似于$(BUILT_PRODUCTS_DIR)/com.mycompany.keyboard.appex/com.mycompany.keyboard
  • 将“测试主机”设置为$(BUNDLE_LOADER)
  • 在“构建阶段”点击中,将“目标依赖项”设置为容器应用和扩展。

完成这些事情后,我可以成功构建它,但总是得到“测试失败”并显示日志Test target SogouInputTests encountered an error (Test session exited(1). without checking in. If you believe this error represents a bug, please attach the log file at /tmp/TestStatus-UXfvxw.log)

我正在使用 Xcode 6 beta 3。

【问题讨论】:

  • 对于它的价值,我在命令行上使用没有扩展的应用程序进行了相同的错误测试
  • 您解决了吗?我也有同样的问题...

标签: ios xcode unit-testing ios-app-extension


【解决方案1】:

我所做的比其他建议更容易(不创建框架,构建设置、阶段等没有奇怪的设置)是将我想要测试的文件(从扩展目标)添加到 Target Membership 测试目标

唯一的“缺点”是您的测试目标还将包含来自您的扩展程序的文件(而不是像主应用程序那样使用@testable import),但是由于您没有发送测试目标,我会说没有缺点:)

在 Xcode 10 上测试。

注意:仅适用于 Swift 代码,由于 BridgingHeader 无法使用 ObjC。

【讨论】:

  • 它可能在某些情况下有效,而在其他情况下无效。例如,如果您有 Objective-C 代码导入 Bridging-header 并将其添加到测试目标,编译将失败,因为 bridging header 是特定于目标的。
  • 是的,你说得对,我会更新我的答案,说明它只适用于 Swift,感谢您的关注!
  • 另见here
【解决方案2】:

在尝试对扩展进行单元测试时遇到了类似的问题。独立地做了与作者尝试的完全相同的事情,Bundle Loader 指向 .appx 路径,当然没有成功。 我真的不喜欢为测试创建一个单独的框架的想法,所以我最终将可测试的源代码添加到扩展测试目标中。如果您的扩展程序中没有太多源文件,这真的很简单:

  1. 在项目设置中选择您的扩展测试目标
  2. 转到构建阶段
  3. 扩展编译源
  4. 点击+
  5. 使用可测试代码添加源文件。
  6. 为测试而构建

为什么会这样:

一旦您将扩展源添加到扩展测试目标中,XCode 将重复引用它们中的每一个,并在正常扩展构建和测试构建中进行编译,从而消除链接问题。

有什么缺点吗?

您必须手动同步扩展测试目标中的源文件列表。每当您在扩展目标中添加/删除文件时,您可能需要在其测试目标中执行相同操作。

【讨论】:

【解决方案3】:

我已向 Apple 报告了该错误。可悲的是,答案是键盘扩展现在不支持单元测试。答案来自苹果:

  • 目前不支持在应用扩展中运行单元测试
  • 相反,将您要测试的代码分解到框架中并在那里测试代码
  • 将框架链接到您的扩展中

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 2019-02-04
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多