是否可以将 UITests 目标中的文件复制到应用程序的文档目录中?

Posted

技术标签:

【中文标题】是否可以将 UITests 目标中的文件复制到应用程序的文档目录中?【英文标题】:Is it possible to copy a file in a UITests target to the documents directory of the app? 【发布时间】:2019-10-29 03:11:55 【问题描述】:

我的 UITests 目标中有一个示例文本文件。我想将此文件复制到应用程序的文档目录,以便在我的应用程序中执行文件上传测试时,我可以通过文件应用程序选择它并上传。

【问题讨论】:

为什么要投反对票?请解释原因 我没有投反对票,但是您尝试了什么?这应该与在您的应用程序中复制文件没有太大不同,但在您的测试文件中除外。或者您可以检查您的应用程序以查看测试是否正在运行,如果是,请复制该文件。 请点赞。我刚刚尝试将包中的文件复制到应用程序的文档目录中。但是当我查看文件应用程序时,文件不在这里。请注意,我正在做一些 ui 测试。 您是否更新了您的信息列表以包括LSSupportsOpeningDocumentsInPlaceUIFileSharingEnabledUISupportsDocumentBrowser? (check out this article for example) 此外,如果您想要投票,您应该更详细地更新您的问题,指出您尝试过的内容并提供信息以重现问题:more info here。 我会检查的。谢谢。 【参考方案1】:

这可以通过使用 XCUIApplication 的 launchArguments 来实现。它需要在App的plist中包含以下键:LSSupportsOpeningDocumentsInPlaceUIFileSharingEnabledUISupportsDocumentBrowser

// File: FileUploadUITests.swift
// Target: UITests
func launchApplication() 
    let fileName = "__File_12345678910.txt"
    let app = XCUIApplication()
    app.launchArguments.append("-fileUrlPath")
    app.launchArguments.append(sampleTextFileURL().path)
    app.launchArguments.append("-fileName")
    app.launchArguments.append(fileName)
    app.launch()


func sampleTextFileURL() -> URL 
    let bundle = Bundle(for: FileUploadUITests.self)
    return bundle.url(forResource: "text_file_example", withExtension: "txt")!


// File: TestHelper.swift
// Target: App
@discardableResult
func processArgumentsForTesting() -> Bool 
    if let index = ProcessInfo.processInfo.arguments.index(where:  $0 == "-fileUrlPath" ) 
        let path = ProcessInfo.processInfo.arguments[index + 1]
        let url = URL(string: path)!
        let fileName: String?
        if let index = ProcessInfo.processInfo.arguments.index(where:  $0 == "-fileName" ) 
            fileName = ProcessInfo.processInfo.arguments[index + 1]
         else 
            fileName = nil
        
        copyTestFileToDocumentDirectory(url: url, fileName: fileName)
        return true
    
    return false


private let fileManager = FileManager.default

private var documentDirectoryURLOfTheApp: URL 
    let paths = fileManager.urls(for: .documentDirectory, in: .allDomainsMask)
    let documentDirectoryPath = paths.first!
    return documentDirectoryPath



@discardableResult
private func copyTestFileToDocumentDirectory(url: URL, fileName: String? = nil) -> Bool 
    let directory = documentDirectoryURLOfTheApp
    let destination = directory.appendingPathComponent(fileName ?? url.lastPathComponent).path
    let isOkay: Bool
    do 
        if fileManager.fileExists(atPath: destination) 
            try fileManager.removeItem(atPath: destination)
        
        try fileManager.copyItem(atPath: url.path, toPath: destination)
        isOkay = true
     catch 
        isOkay = false
    
    return isOkay


// File: AppDelegate.swift
// Target: App
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    processArgumentsForTesting()
    return true

【讨论】:

以上是关于是否可以将 UITests 目标中的文件复制到应用程序的文档目录中?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode中构建规则中的“复制到目标”是啥?

Xamarin.UITests - 在真实设备上进行测试 - iOS - 应用权限弹出窗口问题

如何确定文件是不是已复制到目标

将现有音频文件复制到另一个目标时出错

运行Python脚本以在编译目标之后将文件复制到文件夹中

UITests - 如何在UITests中获取当前语言