在运行 XCTests 时访问主应用程序包

Posted

技术标签:

【中文标题】在运行 XCTests 时访问主应用程序包【英文标题】:Accessing Bundle of main application while running XCTests 【发布时间】:2018-01-17 12:38:54 【问题描述】:

在测试中target -> General -> Testing: set Host Application to None,因此不会启动任何应用。

但在这种情况下,我无法使用 Bundle.main.resourcePath 并访问我的主应用程序的资源(其中包含一些命令文件作为资源,我需要使用 Process() 运行它们)。

有人可以提出解决方案吗?

【问题讨论】:

【参考方案1】:

Bundle(identifier: "com.something.app") 将为您获取特定捆绑包 ID 的捆绑包。问题是,如果您的主要目标的捆绑 ID 发生更改,这将失败。

您也可以尝试获取特定类的捆绑包:

let bundle = Bundle(for: SomeClass.self)

SomeClass 是主包中的一个类。

【讨论】:

我曾尝试过 'Bundle(identifier: mainappbundleid)',但是在运行测试目标时,这给出了 nil,而 'Bundle(for: SomeClass.self)' 给出了测试目标本身的包。 我还是卡住了。运行测试目标时,是否会加载主应用程序包(因为主机应用程序设置为无)?可能这就是为什么 Bundle(identifier) 给出 nil 的原因?【参考方案2】:

还将文件添加到 Test target 的 'Copy Bundle Resources',然后使用以下代码获取资源的路径,而不是 "\(Bundle.main.resourcePath!)/test.command"

let testBundle = Bundle(for: type(of: self)) let path = "\(testBundle.resourcePath!)/test.command""

【讨论】:

以上是关于在运行 XCTests 时访问主应用程序包的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该使用单独的测试目标来运行 XCTests,我应该怎么做?

如何修复 Xcode 10 中的“XCtests 间歇性无法在模拟器中启动应用程序”

XCTests 中的核心数据

单例不使用 XCTests - iOS

如果使用模拟器,从 Xcode 和 xcodebuild 运行 xctests 会失败 - dyld:未加载库:@rpath/libswiftSwiftOnoneSupport.dylib 问题 -

访问包内主应用程序的资产