Как мне записать в локальный файл в Swift / XCTest? - PullRequest
0 голосов
/ 19 сентября 2018

Мой главный вопрос касается сохранения скриншота из приложения AppleTV с использованием XCTest и Swift4 (работающего на MacBook в паре с телевизионным устройством), но у меня возникают проблемы даже при записи простой текстовой строки в локальный файл.Если я смогу заставить работать этот простой файл-сохранить, я надеюсь, что смогу решить проблему со скриншотом.(Прошу прощения за то, что это выглядит как два вопроса, но они, похоже, связаны между собой и являются результатом моих усилий по устранению неполадок.)

Во-первых, вот что я пытаюсь сделать со скриншотом на основе примера кода, который я где-то нашелонлайн:

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 - он просто должен приземлиться где-нибудь на моем ноутбуке (не на устройстве ТВ).Чего мне не хватает?

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете добавить вложение в тестовый набор и также сохранить его на диск.Проблема заключалась в том, что папка 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)
}

Если вы хотите просмотреть вложение, щелкните правой кнопкой мыши на тестовом примере, выберите Перейти к отчету и развернитедерево.Со временем вы увидите скриншот:

Jump to test report

...