如何将 XCTest 依赖与生产/主要目标联系起来?

ImJ*_*Lol 6 xcode xctest swift

我正在尝试在 Swift 中为 XCTest 框架编写扩展。为此,我创建了一个具有两个目标的项目:主/生产目标和测试目标。

当我为 XCTest 编写扩展时,我还需要在我的主要/生产目标中导入 XCTest。但是,我很难这样做。当我在 Xcode 中单击我的项目,然后选择主要目标,转到 Build Phases, Link Binary With Libraries 并在那里添加 XCTest 时,出现编译错误:

ld:找不到框架 XCTest clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

我也尝试了此处提供的解决方案,但不幸的是也不起作用。

brt*_*ury 4

关于 XCTest 本身的辅助信息很少且很难找到,我也在寻找相同的功能并最终设法让它工作。

我使用的是 XCode 10.1,并在装有 iOS 11 的真实 iPhone 上运行。我确信通用技术适用于其他版本,但可能需要一些调整。

一般步骤在这个 stackoverflow 答案中进行了描述,但需要几个额外的步骤和调整才能在真正的 iPhone 上工作:

是否可以在 iOS 应用程序中运行 XCTest 测试?

请按照上述链接中的步骤操作。以下步骤与我所要求的说明有所偏差。

  1. 按照上述链接所述复制 XCTest 框架。注意:使用平台框架iPhone.OS,而不是所描述的模拟器。您可以在 Mac 上的实际 XCode 应用程序包中找到此框架文件。(右键单击“显示包内容”,然后查看./Contents/Developer/Platforms/iPhoneOS.platform

  2. 禁用应用程序目标中的位码。这解决了链接器错误。这是启用它的示例:how to ENABLE_BITCODE in xcode 7?

  3. 将文件拖动到目标中的链接二进制文件时XCTest.framework,请确保将其也拖动到“链接的框架和库”选项正上方的“嵌入式二进制文件”。如果您不这样做,您将收到运行时错误。

将框架添加到嵌入式二进制文件

  1. 在新的 Swift 中,用于启动测试的 ViewController 代码略有不同,这是我正在使用的代码:

import UIKit
import XCTest

class ViewController: UIViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("running tests!")
        let suite = XCTestSuite.default;
        for test in suite.tests {
            test.run()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

应该是这样!当我运行上面的应用程序,然后触摸屏幕时,我的 UITesting 目标中的所有测试都完美运行并通过!