20

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

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

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

完成这些事情后,我可以成功构建它,但总是得到带有 log 的“Test Failed” 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。

4

3 回答 3

20

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

  • 目前不支持在应用扩展中运行单元测试
  • 相反,将要测试的代码分解到框架中并在那里测试代码
  • 将框架链接到您的扩展
于 2014-09-23T05:06:43.183 回答
3

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

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

为什么有效:

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

有什么缺点吗?

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

于 2017-04-14T19:36:08.080 回答
2

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

在此处输入图像描述

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

在 Xcode 10 上测试。

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

于 2019-10-24T09:31:07.593 回答