gpt4 book ai didi

swift - 如何在 Swift/XCTest 中写入本地文件?

转载 作者:行者123 更新时间:2023-11-28 07:40:28 26 4
gpt4 key购买 nike

我的最终问题是关于使用 XCTest 和 Swift4(在与电视设备配对的 MacBook 上运行)从 AppleTV 应用程序保存屏幕截图,但我什至无法将简单的文本字符串写入本地文件。如果我能让这个简单的文件保存工作,我希望我能解决屏幕截图问题。 (很抱歉让这看起来像两个问题,但它们似乎是相关的并且是我的故障排除工作的结果。)

首先,根据我在网上某处找到的示例代码,这是我尝试使用屏幕截图进行的操作:

let appshot = XCUIApplication().windows.firstMatch.screenshot()
let shotpath = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask)[0].appendingPathComponent("appshot.png")
let shotpathUrl = URL(string: "file://\(shotpath)")
print("Saving to: \(shotpath)")

do {
try appshot.pngRepresentation.write(to: shotpathUrl!)
} catch {
print("Failed saving screenshot due to \(error)")
}

这给了我以下输出:

Saving to: file:///var/mobile/Containers/Data/Application/77D52C66-353B-4029-97D5-48E6BAE35C92/Downloads/appshot.png
Failed saving screenshot due to Error Domain=NSCocoaErrorDomain Code=4 "The file “appshot.png” doesn’t exist." UserInfo={NSFilePath=///var/mobile/Containers/Data/Application/77D52C66-353B-4029-97D5-48E6BAE35C92/Downloads/appshot.png, NSUnderlyingError=0x1c405bc60 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

当然,该文件不存在,因为这是我要创建的文件。但是/var/mobile 在我的笔记本电脑上也不存在——看起来 FileManager 正在构建的路径可能存在于 AppleTV 设备上,但我希望它在我的测试脚本正在执行的笔记本电脑上。

所以我退出了一个更简单的案例,即使这样也给我带来了问题:

let str = "This is a test"
let path = "file:///Users/haljor/foo.txt"
let pathUrl = URL(string: path)!
print("Path: \(path)")
print("URL: \(pathUrl)")

do {
try str.write(to: pathUrl, atomically: true, encoding: .utf8)
} catch {
print("Caught error writing to \(pathUrl): \(error)")
}

这是输出:

Path: file:///Users/haljor/foo.txt
URL: file:///Users/haljor/foo.txt
Caught error writing to file:///Users/haljor/foo.txt: Error Domain=NSCocoaErrorDomain Code=4 "The folder “foo.txt” doesn’t exist." UserInfo={NSURL=file:///Users/haljor/foo.txt, NSUserStringVariant=Folder, NSUnderlyingError=0x1c40553f0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

在这里,它看起来像是在尝试写入我指定路径的文件夹,而不是文件。显然,在每种情况下,我都有一些不理解的地方。

我真的没有偏好使用完全指定的路径还是使用 FileManager 的东西——它只需要在我的笔记本电脑(而不是电视设备)上的某个地方着陆。我错过了什么?

最佳答案

您可以将附件添加到测试用例并将其保存到磁盘。问题是 Downloads 文件夹可能还不存在于容器中。处理此问题的最佳方法是通过 init-once 属性:

var downloadsFolder: URL = {
let fm = FileManager.default
let folder = fm.urls(for: .downloadsDirectory, in: .userDomainMask)[0]

var isDirectory: ObjCBool = false
if !(fm.fileExists(atPath: folder.path, isDirectory: &isDirectory) && isDirectory.boolValue) {
try! fm.createDirectory(at: folder, withIntermediateDirectories: false, attributes: nil)
}
return folder
}()

func test() {
let appshot = XCUIScreen.main.screenshot()
let attachment = XCTAttachment(screenshot: appshot)
attachment.lifetime = .keepAlways
self.add(attachment)

// Save to container
let url = downloadsFolder.appendingPathComponent("appshot.png")
try! appshot.pngRepresentation.write(to: url)
}

如果要查看附件,请右键单击测试用例,选择跳转到报告 并伸展树(Splay Tree)。您最终会看到屏幕截图:

Jump to test report

关于swift - 如何在 Swift/XCTest 中写入本地文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52411331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com