测试类的包返回 Xcode 10 中的主包,而不是单元测试包

Posted

技术标签:

【中文标题】测试类的包返回 Xcode 10 中的主包,而不是单元测试包【英文标题】:Bundle for test class returns main bundle in Xcode 10, and not unit tests bundle 【发布时间】:2018-06-08 11:42:59 【问题描述】:

我们有托管在应用程序中的单元测试。要加载测试资源,我们使用: Bundle(for: TestClass.self).path(forResource: "some-file", ofType: "json").

在 Xcode 9 中,它返回如下内容:/var/folders/4k/dzpnw8352jn_fl5hcc76pjs8k9qytq/T/com.apple.dt.XCTest/IDETestRunSession-707F04EA-2C21-4BA4-8730-00B0EC0F708F/UnitTests-2C97055A-9154-4521-9D12-7CF32FC38793/Session-UnitTests-2018-06-08_141829-RGxhj2.log

但在 Xcode 10 Bundle(for: TestClass.self) 中返回应用程序包路径/Users/user/Library/Developer/CoreSimulator/Devices/118AACB9-486C-4E3B-94EA-257C3F082AE1/data/Containers/Bundle/Application/4234B280-E49C-4044-BAF4-CBFFEA8AFDB4/App.app

由于这些文件包含在单元测试目标中,因此无法再找到它们

更新:

在 Xcode 10.1 中修复

【问题讨论】:

【参考方案1】:

这可能是 Xcode 10/Swift 4.2 中的一个错误,因为在发行说明中还有一个与 Bundle 相关的错误。您绝对应该提交一份雷达文件以确保该问题已为人所知。

来自 Xcode 10 测试版发布说明

• Foundation API Bundle.init(for: AnyClass) 在从泛型类继承的类上使用时始终返回应用程序包,即使该类本身不是泛型。 (40367300)

作为一种潜在的解决方法,您可以考虑使用测试目标的包标识符。

要查找测试目标的包标识符,请查看此处:

更新

似乎Bundle 一直是 Xcode 10 的一个持续问题(实际上是 Swift 4.2 出现了问题)。

来自 Xcode 10.1 beta 2 release notes

• Bundle 类的 init(for:) 初始化程序现在可以与 Swift 类一致地工作,包括未在最新操作系统版本上运行时。 (44489216)

【讨论】:

谢谢。让我检查一下我遇到的问题 您能否提供您上面提到的 Bundle.init(for: AnyClass) 总是返回应用程序包的问题的来源 @dev296 它在 Xcode 10 beta 发行说明中,遗憾的是现在无法访问。我已经参考 Xcode 10.1 beta 中修复的类似问题更新了我的答案【参考方案2】:

此问题现已在 Xcode 10.1 中修复,如发行说明已解决的问题中所述 https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_release_notes

【讨论】:

【参考方案3】:

在一些类重构问题消失后。如果类包含 URL 或 URLRequest 属性包不正确。

例如在同一个模块中声明了三个类,并且bundle是不同的:

class WithRequest 
    var request: URLRequest?


class WithURL 
    var url: URL?


class WithString 
    var string: String?


print(Bundle(for: WithRequest.self)) //Incorrect App Bundle
print(Bundle(for: WithURL.self)) //Incorrect App Bundle
print(Bundle(for: WithString.self)) //Correct bundle

【讨论】:

这听起来仍然像一个错误。 Xcode 9 中的行为是否相同?

以上是关于测试类的包返回 Xcode 10 中的主包,而不是单元测试包的主要内容,如果未能解决你的问题,请参考以下文章

Xcode:如何测试主包 .plist 文件内容?

如何在golang中测试主要的包功能?

Xcode 8 单元测试错误:无法确定 TEST_HOST 的包标识符

Xcode 11,使用 Main.storyboard 修复的主界面 [重复]

如何在 Eclipse 上的包中制作子包?

显示不应该存在的文件的主包的内容