iPhone单元测试中的NSHomeDirectory

Posted

技术标签:

【中文标题】iPhone单元测试中的NSHomeDirectory【英文标题】:NSHomeDirectory in iPhone unit test 【发布时间】:2011-12-04 21:24:25 【问题描述】:

在单元测试中使用NSHomeDirectory() 时,我得到:

/Users/hgpc/Library/Application Support/iPhone Simulator/5.0

我期望当前应用程序的实际主目录。比如:

/Users/hgpc/Library/Application Support/iPhone Simulator/5.0/Applications/6D1091C6-02AE-4803-A7DF-D623D0F89579

我做错了什么?

【问题讨论】:

【参考方案1】:

要解决此问题,请将您的单元测试目标构建设置中的 Bundle Loader 的值设置为:

$(BUILT_PRODUCTS_DIR)/MyAppName.app/MyAppName

还有你的测试主机:

$(BUNDLE_LOADER)

然后您应该会发现 NSHomeDirectory() 返回正确的值。

【讨论】:

这似乎比其他解决方案更受欢迎。更接近模拟正在发生的事情。在模拟器和设备上同样适用。 现在是默认了吗?在 XCode 中使用单元测试创​​建的新项目中,UT 目标的“Bundle Loader”设置与上述匹配。 是的,现在是默认设置。 我需要在 UI 测试中实现相同的目标。是否可以?因为这只适用于单元测试。【参考方案2】:

不幸的是,在单元测试(或逻辑测试)中 - 你并不是真正的“在你的应用程序中”(即它的沙箱)。这就是为什么像 NSDocumentDirectory 或 [NSBundle mainBundle] 这样的东西不起作用的原因。

如果它适合你,我会继续在

中创建一个“文档”文件夹
/Users/hgpc/Library/Application Support/iPhone Simulator/5.0

您可能希望在测试的 setUp 中执行此操作,这样您就可以在 tearDown 中删除它。

如果这不起作用,因为您的测试依赖于应用程序 NSDocumentDirectory 中已经存在的内容,您可能需要重新考虑一下您的测试,因为它们都应该是独立的(即安装包中的所有资源在设置中)

您也可以使用 NSLibraryDirectory 代替 NSDocumentDirectory,具体取决于您要测试的内容。

【讨论】:

【参考方案3】:

如果您想将测试目标自定义为应用程序测试,您应该添加 Andrew Ebling 提到的参数:

$(BUILT_PRODUCTS_DIR)/MyAppName.app/MyAppName

还有您的测试主机:

$(BUNDLE_LOADER)

如果您没有此参数,则意味着您的测试是逻辑的。但是,如果您添加此参数,您会将测试更改为应用程序测试,并注意到 AppDelegate 将启动您是否运行测试。

请参阅link 了解更多信息。

因此您可以使用 NSHomeDirectory( 仅用于应用程序测试。

【讨论】:

【参考方案4】:

您应该在 ios 设备上使用

NSArray *path = NSSearchPathForDirectoriesInDomains(
            NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirPath = [paths objectAtIndex:0];

【讨论】:

以上是关于iPhone单元测试中的NSHomeDirectory的主要内容,如果未能解决你的问题,请参考以下文章

为 iPhone / iPad 编写单元测试的最佳方法是啥?

iPhone 验收/单元测试

iPhone 命令行单元测试(和文件 I/O)

Iphone 单元测试错误:权限被谷歌工具箱拒绝

iPhone单元测试链接问题,找不到DevToolsBundleInjection.framework

iPhone Nibs 如何使用逻辑测试进行单元测试?