首页 > 解决方案 > Xcode单元测试:尝试将测试数据从单元测试写入项目文件夹时权限被拒绝

问题描述

我对在 macOS 上运行的 Cocoa 应用程序进行了 Xcode 单元测试。当单元测试运行时,我想将一些数据保存到应用程序的项目文件夹中,以便下次测试运行时可以将其读回(我正在尝试使用此快照测试库)。

但是,尝试创建输出目录失败并出现权限被拒绝错误:

Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “TestOutput”
in the folder “__Snapshots__”." 
UserInfo={NSFilePath=/Users/test/code/TestApp/TestOutput/__Snapshots__/SimpleTest,
NSUnderlyingError=0x600000c0c0c0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

我认为这是因为单元测试在沙盒中运行,并且不允许访问临时目录之外的文件和目录。

有没有办法扩展单元测试的沙箱以包括对应用程序项目文件夹中特定目录的访问?

标签: xcodeunit-testingcocoasandboxxctest

解决方案


只需将您的文件存储在应用程序支持文件夹中。此文件夹位于沙箱内,其目的是存储应用程序所需的数据。

您可以使用获取它的路径,NSSearchPathForDirectoriesInDomains并且应该检查它是否存在(在返回的路径中),如果需要则创建它。

评论后的补充:

有一个已弃用的权利可能对您com.apple.security.files.all有用,但不要尝试在您通过 Apple 分发的任何内容中使用它!使用它可能会影响您的测试,因为它们也可以访问所有内容......从历史上看,有授予访问特定路径的权利,网络上的一些考古学也可能会出现这些权利。

执行此操作的正确方法是存储一个安全范围的书签,但您确实需要一些用户交互才能让它运行:在第一次运行时抛出一个标准文件打开对话框,供用户选择存储文件的文件夹,然后构建并保存(例如在用户默认值中)一个社会范围的书签。在随后的运行中,只需加载书签并激活它。


推荐阅读