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

时间:2018-06-08 11:42:59

标签: ios unit-testing xctest xcode10

我们有在应用程序中托管的UnitTests。要加载测试资源,我们使用: 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中修复

3 个答案:

答案 0 :(得分:1)

这可能是Xcode 10 / Swift 4.2中的一个错误,因为在发行说明中还有另一个与Bundle相关的错误。你一定要提交雷达以确保问题已知。

来自Xcode 10 beta发行说明

  

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

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

要查找测试目标的包标识符,请在此处查看: enter image description here

更新

似乎Bundle一直是Xcode 10的问题(真的是Swift 4.2存在问题)。

来自Xcode 10.1 beta 2 release notes

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

经过一些课程重构问题消失了。如果类包含URL或URLRequest属性包不正确,则确实如此。

e.g。在同一个模块中声明了三个类,而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