iPhone - 逻辑单元测试资源的获取

28

我一直在遵循苹果公司关于编写iPhone单元测试的文档,但是直接使用时似乎不起作用。我不确定单元测试将从何处获取应用程序委托的引用。

我的依赖关系如下所示: My_Program_target -> UnitTesting_target -> UnitTests_bundle

以下代码片段是断言失败的地方。我非常熟悉CPPUNIT,但我不理解它如何跨越这个问题。

- (void) testAppDelegate {

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
    STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate");

}

另外:

在我的处理方式中,我决定进行逻辑测试。我正在尝试读取一个XML文件,但我无法解决bundle,这将为我提供访问文件的路径。我尝试粘贴allBundles输出的路径,但该路径似乎也无法工作。以下是我在测试中执行的内容(您可以看到我正在使用的调试语句来输出bundles的路径):

NSLog(@"BundlePaths: %@", [NSBundle allBundles]);
   NSString * path = [[NSBundle bundleWithPath:@"$(TARGET_BUILD_DIR)"] pathForResource:@"SimpleTestList" ofType:@"plist"];
   STAssertNotNil(path, @"Bundle Location couldn't find the file specified");

实际上,路径上的断言并不成功,但我不确定应该放什么路径或目录来引用我已经告诉它复制包资源的unitTest bundle。调用[NSBundle mainBundle]也不起作用。


在Gary的解决方案基础上,我想出了以下Xcode:TEST vs DEBUG预处理器宏 - ma11hew28
3个回答

72

好的,我已经弄清楚了。为了在单元测试中打开一个文件,你需要将要打开的文件指定为:

NSString * filePath = [[NSBundle bundleForClass:[self class] ] pathForResource:@"SimpleTestList" ofType:@"plist"];

如果您将此代码添加到编译为单元测试包的类中,该类将在单元测试包中查找SimpleTestList.plist文件。

对于单元测试,只需确保设置“复制资源包”以将plist包含在单元测试包中即可。


那正是我的问题。谢谢你发布这个! - kubi
另外,如果有人想知道,我在关于managedObjectModels方面也遇到了同样的情况,并找到了这个链接。http://www.spacevatican.org/2009/9/10/unit-testing-core-data-iphone-apps - Gary
1
我必须像这样微调它:NSURL *modelURL = [[NSBundle bundleForClass:NSClassFromString(@"NSManagedObjectModel_AdditionsTests")] URLForResource:@"Tests" withExtension:@"momd"] - ma11hew28

3
如果您需要应用程序委托,必须在设备上而不是模拟器上运行单元测试。此外,您将看到单元测试输出出现在控制台中,而不是构建结果中。
关键要知道的是有两种类型的单元测试——运行在可执行文件之外的逻辑测试,以及需要完整运行环境的集成系统测试。
逻辑测试必须选择模拟器作为目标进行运行,否则它们将无法运行。
集成系统测试必须作为可执行文件的一部分,在设备上运行——您需要一个新的目标来完成这个任务。
很抱歉这些都很复杂,与许多其他单元测试框架相比,这方面仍然处于研究阶段。

嗯,对于我现在要做的事情,应用程序委托可能不是必需的。我目前想要实现的是测试我的模型。在最新的开发工具包中使用OCUnit之前,我在应用程序的派生类中完成了我的测试。我会实例化这个派生类,并且它会在运行和显示用户看到的视图之前,在一个单独的线程中进行自我测试。我正在尝试将其分解为一个单元测试。我当前的问题是,即使它在捆绑包中,我仍然无法让OCUnit测试看到plist文件。 - Gary
实际上,“在包中”是指我将其添加到该副本文件夹中的包中。 - Gary

0

使用URL而不是字符串路径的Gary上面的答案的Swift 3翻译如下:

let url = Bundle(for: type(of: self)).url(forResource: "SimpleTestList", withExtension: "plist")

请注意关键且不明显的部分:type(of: self)而不是[self class]。该内容与编程有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接