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")

这并不理想,也许还有其他一些解决方案。但它工作正常并且具有可预测的行为。