IOS 测试与 Mac 文件系统的交互
IOS tests interacting with Mac file system
所以我在玩 swiftui XCTestCase。我有一堆 运行 的测试,并得到它们在模拟器或设备上 运行ning。
但是 - 我现在需要与我正在进行的 Mac 交互 - 即从 IOS 测试中读取和写入 Mac 文件系统 - 是吗可能 - 因为测试是 运行ning 在模拟器中。
XCTestCase
可以访问本地文件系统,但有一些限制。例如:
func testExample() throws {
print("\(Bundle.allBundles)")
print("\(Bundle(for: type(of: self)))")
}
此代码将产生如下内容:
[NSBundle </Volumes/Extended/Archive/Xcode_11.6.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/CoreServices/CoreGlyphs.bundle> (not yet loaded), NSBundle </Users/dive/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Bundle/Application/5DE85255-F202-4BAB-871A-7C20C2DB37D9/TestingBundles.app> (loaded), NSBundle </Users/dive/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Bundle/Application/5DE85255-F202-4BAB-871A-7C20C2DB37D9/TestingBundles.app/Frameworks> (not yet loaded), NSBundle </Users/dive/Library/Developer/Xcode/DerivedData/TestingBundles-exdmnsfatmhbztarzgjvvlwwpoan/Build/Products/Debug-iphonesimulator/TestingBundles.app/PlugIns/TestingBundlesTests.xctest> (loaded)]
NSBundle </Users/dive/Library/Developer/Xcode/DerivedData/TestingBundles-exdmnsfatmhbztarzgjvvlwwpoan/Build/Products/Debug-iphonesimulator/TestingBundles.app/PlugIns/TestingBundlesTests.xctest> (loaded)
如您所见,这些路径与 DerivedData 目录相关。因此,您不能使用项目或测试目录的相对路径。
也可以直接使用FileManager
。它继承了相同的环境,也可以访问本地文件系统。例如:
func testExample() throws {
let manager = FileManager.default
print(try manager.contentsOfDirectory(atPath: ("~/" as NSString).expandingTildeInPath))
}
它会产生这样的东西:
/Users/USER_NAME/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Data/Application/0D16C376-80A6-4DAE-B435-2FEF7F08A83A
注意,由于环境的原因,它指向模拟器中用户的主目录。
作为解决方法,我们使用共享用户目录来共享此类数据。复制它的测试前操作中有一个“运行脚本”:
然后我们从 XCTestCase
像这样访问它:
try manager.contentsOfDirectory(atPath: "/Users/Shared/TestData")
这并不理想,也许还有其他一些解决方案。但它工作正常并且具有可预测的行为。
所以我在玩 swiftui XCTestCase。我有一堆 运行 的测试,并得到它们在模拟器或设备上 运行ning。
但是 - 我现在需要与我正在进行的 Mac 交互 - 即从 IOS 测试中读取和写入 Mac 文件系统 - 是吗可能 - 因为测试是 运行ning 在模拟器中。
XCTestCase
可以访问本地文件系统,但有一些限制。例如:
func testExample() throws {
print("\(Bundle.allBundles)")
print("\(Bundle(for: type(of: self)))")
}
此代码将产生如下内容:
[NSBundle </Volumes/Extended/Archive/Xcode_11.6.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/CoreServices/CoreGlyphs.bundle> (not yet loaded), NSBundle </Users/dive/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Bundle/Application/5DE85255-F202-4BAB-871A-7C20C2DB37D9/TestingBundles.app> (loaded), NSBundle </Users/dive/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Bundle/Application/5DE85255-F202-4BAB-871A-7C20C2DB37D9/TestingBundles.app/Frameworks> (not yet loaded), NSBundle </Users/dive/Library/Developer/Xcode/DerivedData/TestingBundles-exdmnsfatmhbztarzgjvvlwwpoan/Build/Products/Debug-iphonesimulator/TestingBundles.app/PlugIns/TestingBundlesTests.xctest> (loaded)]
NSBundle </Users/dive/Library/Developer/Xcode/DerivedData/TestingBundles-exdmnsfatmhbztarzgjvvlwwpoan/Build/Products/Debug-iphonesimulator/TestingBundles.app/PlugIns/TestingBundlesTests.xctest> (loaded)
如您所见,这些路径与 DerivedData 目录相关。因此,您不能使用项目或测试目录的相对路径。
也可以直接使用FileManager
。它继承了相同的环境,也可以访问本地文件系统。例如:
func testExample() throws {
let manager = FileManager.default
print(try manager.contentsOfDirectory(atPath: ("~/" as NSString).expandingTildeInPath))
}
它会产生这样的东西:
/Users/USER_NAME/Library/Developer/CoreSimulator/Devices/9CDF771B-204F-45B9-AAC3-6036AB7B117D/data/Containers/Data/Application/0D16C376-80A6-4DAE-B435-2FEF7F08A83A
注意,由于环境的原因,它指向模拟器中用户的主目录。
作为解决方法,我们使用共享用户目录来共享此类数据。复制它的测试前操作中有一个“运行脚本”:
然后我们从 XCTestCase
像这样访问它:
try manager.contentsOfDirectory(atPath: "/Users/Shared/TestData")
这并不理想,也许还有其他一些解决方案。但它工作正常并且具有可预测的行为。