无法在 iphone 单元测试中从 NSBundle 加载文件

Posted

技术标签:

【中文标题】无法在 iphone 单元测试中从 NSBundle 加载文件【英文标题】:cant load files from NSBundle in iphone unit test 【发布时间】:2011-03-31 02:22:00 【问题描述】:

我正在使用 XCode 4。

有人可以向我解释为什么当我编写了一个单元测试(在测试目标下)时它找不到我的本地文件资源吗?我正在尝试在单元测试中从 NSBundle 加载 plist 文件,但它在单元测试目标中不起作用。我试过把它扔到测试目标的类区域下。

这是我的代码:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"urlMappings.plist"];
self.urlMappings  = [NSDictionary dictionaryWithContentsOfFile:finalPath];

self.urlMappings 出于某种原因是空的,即使 urlMappings.plist 肯定存在于我的项目中。这是 urlMappings.plist 的来源,以证明它实际上是一本字典。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>%server%view.html</key>
    <string>testHtml1.html</string>
</dict>
</plist>

有什么想法吗?谢谢你

【问题讨论】:

基于 MikeSimmons 的解决方案,我提出了以下Xcode: TEST vs DEBUG preprocessor macros。 【参考方案1】:

在测试目标下,你不应该使用 [NSBundle mainBundle],因为它是主包,而不是测试包。你应该使用 [NSBundle bundleForClass:[self class]] 替换。

【讨论】:

非常有意义。我已经给你解决方案了。谢谢!【参考方案2】:

解决方案(没有意义)是它不在主要目标的捆绑资源中。即使我只是在测试中使用它,它也必须在两个目标的捆绑资源中。

有人知道为什么会这样吗?

【讨论】:

以上是关于无法在 iphone 单元测试中从 NSBundle 加载文件的主要内容,如果未能解决你的问题,请参考以下文章

IDEA中无法在@Test测试单元中从控制台输入数据的解决方案

Xcode 7.2:无法在 iPhone 6s 上运行单元测试

如何在单元测试中从依赖注入容器中获取实例?

在 Swift 中从 NSBundle 获取文件路径

在 iPhone 模拟器中从硬盘读取文件

IOS6 横向在仅纵向 iPhone 应用程序中从 uiwebview 播放嵌入的 youtube 视频