在 Swift 单元测试中创建临时文件

Max*_*Max 5 xcode unit-testing file swift

我想编写一个读取/写入文件的单元测试,因此我创建了一个辅助函数来创建临时文件(改编自Apple的文档):

func mkTmp() -> URL {
    let fileManager = FileManager.default
    let directory = fileManager.temporaryDirectory
    let filename = UUID().uuidString
    let fileURL = directory.appendingPathComponent(filename)

    addTeardownBlock {
        do {
            if fileManager.fileExists(atPath: fileURL.path) {
                try fileManager.removeItem(at: fileURL)
                XCTAssertFalse(fileManager.fileExists(atPath: fileURL.path))
            }
        } catch {
            XCTFail("Error while deleting temporary file: \(error)")
        }
    }

    do {
        try fileManager.createDirectory(at: fileURL, withIntermediateDirectories: true)
        // FIXME: this always fails for some reason
        XCTAssertTrue(fileManager.createFile(atPath: fileURL.path, contents: "test".data(using: .utf8)))
    } catch {
        XCTFail("Error while making temp dir: \(error)")
    }
    return fileURL
}
Run Code Online (Sandbox Code Playgroud)

问题是那条createFile线接近末尾。总是失败!单元测试对临时目录没有写权限吗?

如果我忽略该失败并尝试写入文件

let file = try FileHandle(forWritingTo: mkTmp())
defer { file.closeFile() }
file.write(data)
Run Code Online (Sandbox Code Playgroud)

当我尝试打开文件句柄时收到文件不存在的错误。

我是否需要在单元测试的某处设置文件写入权限?

Dav*_*ist 5

无法创建该文件,因为该 url/path\xe2\x80\x94 处已存在由 . 创建的目录fileManager.createDirectory(at: fileURL, ...)fileURL您可以通过添加这些断言来检查调用后存在的内容来确认这一点fileManager.createDirectory(at: fileURL, ...)

\n\n
try fileManager.createDirectory(at: fileURL, withIntermediateDirectories: true)\n\nvar isDirectory: ObjCBool = false\nXCTAssertTrue(fileManager.fileExists(atPath: fileURL.path, isDirectory: &isDirectory))\nXCTAssertTrue(isDirectory.boolValue)\n
Run Code Online (Sandbox Code Playgroud)\n\n

为了能够创建文件,fileURL您只需创建其父目录:

\n\n
try fileManager.createDirectory(at: fileURL.deletingLastPathComponent(), withIntermediateDirectories: true)\n
Run Code Online (Sandbox Code Playgroud)\n