Xcode单元测试:尝试将测试数据从单元测试写入项目文件夹时权限被拒绝

Posted

技术标签:

【中文标题】Xcode单元测试:尝试将测试数据从单元测试写入项目文件夹时权限被拒绝【英文标题】:Xcode unit test: Permission denied when trying to write test data from unit test to project folder 【发布时间】:2019-12-01 08:43:45 【问题描述】:

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

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

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"

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

有什么方法可以扩展单元测试的沙箱以包括对应用项目文件夹中特定目录的访问?

【问题讨论】:

【参考方案1】:

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

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

评论后的补充:

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

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

【讨论】:

感谢您的建议。问题是这些文件是项目源代码的一部分并且受版本控制。我当前的解决方法是在运行测试之前将它们复制到 $TMPDIR,然后再将它们复制回源文件夹。我希望有一种方法可以扩展沙箱,这样就不需要这一步了。 @Mark - 添加了附录。 HTH

以上是关于Xcode单元测试:尝试将测试数据从单元测试写入项目文件夹时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 UI 测试/单元测试期间将自定义字符串写入日志

数据流单元测试

由于 otest 错误,无法从命令行运行 Xcode 单元测试

使用命令行的 Xcode 4 单元测试

如何使用 Xcode 4 运行单元测试的子集

如何在 Xcode 中为 Apple Watch 添加单元测试?