fileManager.createFileAtPath 在单元测试期间失败

Posted

技术标签:

【中文标题】fileManager.createFileAtPath 在单元测试期间失败【英文标题】:fileManager.createFileAtPath fails during unit tests 【发布时间】:2018-04-02 21:58:52 【问题描述】:

目前我正在尝试在单元测试期间创建文件,以查看是否可以在创建数据后检索数据,但 fileManager.createFileAtPath 总是失败。我看了这篇文章:fileManager.createFileAtPath always fails 我实现了该答案的解决方案,但仍然失败。这是单元测试和附带函数的样子:

internal func getCacheFolderPath() -> String 
    var folderPath = ""
    guard let path = self.urls(for:.cachesDirectory , in: .userDomainMask).last?.path else 
        return folderPath
    

    folderPath = path + "/NetworkCache"
    if !self.fileExists(atPath: folderPath) 
        do 
            try  self.createDirectory(atPath: folderPath, withIntermediateDirectories: false, attributes: nil)
         catch 
            print(error.localizedDescription)
        
    

    return folderPath


func test_createFile()
    let path = sut?.getCacheFolderPath()
    let fileManager = FileManager.default

    if !FileManager.default.fileExists(atPath: path!) 
        do 
            try FileManager.default.createDirectory(atPath: path!, withIntermediateDirectories: true, attributes: nil)
         catch let error as NSError 
            print(error.localizedDescription)
        
    

    let isFileCreated = fileManager.createFile(atPath: path!, contents: mockData, attributes: nil)

    print(isFileCreated)//This always returns false

【问题讨论】:

哪条线失败了?错误是什么? @rmaddy 不是有错误,而是文件从未创建并返回 false。我正在尝试让它创建文件并返回 true。 path 的实际值是多少?为什么不使用Data write(to:) 而不是FileManager createFile?然后你就可以看到它失败的原因了。 @rmaddy 失败的原因是它说文件或文件夹不存在。但应该是因为目录是在创建文件之前先创建的, @rmaddy data.write(to:) 是一个很好的电话。有一个错误 NSError 域:“NSCocoaErrorDomain” - 代码:512,我正在调查它。 【参考方案1】:

使用 data.write(to:) 而不是 create file 有助于确定问题所在。看起来我正在创建一个文件夹作为文件路径并尝试将文件保存到该路径。因为它是一个文件而不是一个文件夹,所以它返回的是那里已经存在的东西。

完成后的工作代码如下所示:

  func saveData(data: Data, forFileName fileName: String, completionHandler: @escaping (URL?)->()) 
        let url = URL(fileURLWithPath: self.filePathForFileName(name: fileName))
        print("saveData:\(url)")
        do 
           // [data writeToFile:[self thdncFilePathForFileName:name] atomically:YES];
            try  data.write(to: url, options: .atomic)
              completionHandler(url)
         catch  
            print(error.localizedDescription)
            completionHandler(nil)

        
    


 func test_createFile()

        var isSaved: Bool = false

        let path = sut?.getCacheFolderPath()

        let promise = expectation(description: "Completion Hander invoked")


        if !FileManager.default.fileExists(atPath: path!)
        
            do 
                try FileManager.default.createDirectory(atPath: path!, withIntermediateDirectories: true, attributes: nil)
             catch let error as NSError 
                print(error.localizedDescription)
            
        
        sut?.saveData(data: mockData!, forFileName: filePath, completionHandler:  (url) in

            let fileManager = MockFileManager.default

            if fileManager.fileExists(atPath: self.sut!.filePathForFileName(name: self.filePath)) 
                isSaved = true
                print("FILE AVAILABLE")

             else 
                isSaved = false
                print("FILE NOT AVAILABLE")
            

            promise.fulfill()
        )

        wait(for: [promise], timeout: 10, enforceOrder: true)
        XCTAssertTrue(isSaved)
    

【讨论】:

以上是关于fileManager.createFileAtPath 在单元测试期间失败的主要内容,如果未能解决你的问题,请参考以下文章