【问题标题】:How do you create public extensions, in a shared framework, for XCTest?您如何在共享框架中为 XCTest 创建公共扩展?
【发布时间】:2016-11-24 11:18:27
【问题描述】:

例如,我从不使用XCTestCase.expectation 的描述,所以我想使用一个函数为其提供一个默认值,并通过命名明确说明我正在初始化期望,你可以' t 真正使用 XCTestExpectation 的初始化程序。但如果扩展不在测试目标中,则无法编译:

无法为“XCTest”加载底层模块

import XCTest

public extension XCTestCase {
    func makeExpectation() -> XCTestExpectation {
        return expectation(withDescription: "")
    }
}

【问题讨论】:

  • 为什么不在测试目标中包含这个扩展?它只用于测试,对吗?
  • 如果您正在编写一个复杂的应用程序,您可能有多个测试目标 - 我公司的应用程序有大约 10 个内部框架,每个框架都有自己的测试目标。您如何在不重复自己的情况下在测试目标之间共享功能?我能想到的唯一方法是将同一个文件添加到所有 10 个文件中,但这很麻烦。

标签: swift xctest


【解决方案1】:

我在此处 (https://github.com/dtweston/TestFrameworkSample) 创建了一个 xcworkspace,用于演示您的问题的解决方案。此工作区中有两个项目:

  1. 具有 iOS 应用目标和单元测试目标的 SampleApp 项目。
  2. SharedTestFramework 项目导入 XCTest 并声明您在问题中提出的单个扩展。

SampleAppTests 目标链接到 SharedTestFramework 以便能够使用它定义的扩展。单个测试文件导入 SharedTestFramework。

通过这些步骤,我在构建 SharedTestFramework 时也遇到了Cannot load underlying module for 'XCTest'

解决此问题的方法是更新Framework Search Paths 以包含"$(PLATFORM_DIR)/Developer/Library/Frameworks"。现在 SharedTestFramework 编译正确,正如您在我上传的工作区中看到的那样,SampleAppTests 目标能够成功使用它。

老旧的答案

您是否正在构建一个旨在导入测试目标的单独框架?如果是这种情况,那么我认为您只需要从您正在构建的自定义框架中引用 XCTest.framework

另一方面,如果您尝试将此扩展添加到应用程序目标使用的框架,这似乎是个坏主意,因为这意味着将 XCTest.framework 链接到去往在人们的设备上存储和运行。

我不确定这是否可能。我更有信心,这不是 Apple 期望或支持的场景。

【讨论】:

  • 向我们展示如何在一个框架中import XCTest,您可以将其导入到单元测试包中并获得奖励!
  • @Jessy 你是在使用标准的 Xcode 项目,还是在使用 Cocoapods 之类的东西?
  • 我使用迦太基。我认为这与使用带有内置框架的“标准 Xcode 项目”相同。管理起来更容易/更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多