我一直在关注为iPhone编写单元测试的Apple文档,开箱即用,例程似乎不起作用。我不确定我理解单元测试将在何处获得对应用程序委托的引用。
我的依赖关系如下: My_Program_target - > UnitTesting_target - > UnitTests_bundle
以下代码段是断言失败的地方。我对CPPUNIT非常熟悉,但是我很难理解这是怎么回事。
- (void) testAppDelegate {
id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate");
}
此外:
我决定采用我的方法进行逻辑测试。我正在尝试读取XML文件,但我没有运气解析捆绑包,这将为我提供访问我的文件的路径。我已经尝试粘贴allBundles的路径输出,但是这条路径似乎也没有用。下面是我在测试中执行的内容(你可以看到我用来输出包的路径的调试语句):
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捆绑包。调用[NSBundle mainBundle]也不起作用。
答案 0 :(得分:73)
好的,所以我已经弄明白了。要在单元测试中打开文件,您需要指定要打开的文件:
NSString * filePath = [[NSBundle bundleForClass:[self class] ] pathForResource:@"SimpleTestList" ofType:@"plist"];
如果将其包含在作为单元测试包的一部分编译的类中,则该类将在单元测试包内查找SimpleTestList.plist文件。
对于单元测试,只需确保设置“复制捆绑资源”以将plist包含在单元测试包中。
答案 1 :(得分:3)
如果您需要应用程序委托,则必须在设备本身而不是模拟器上运行单元测试。此外,您将看到单元测试输出显示在控制台中,而不是在构建结果中。
要知道的关键是有两种类型的单元测试 - 在可执行文件之外运行的逻辑测试,然后是需要完整运行环境的集成系统类型的测试。
逻辑测试必须在选择作为目标的模拟器的情况下运行,否则它们将无法运行。
集成系统测试必须作为可执行文件的一部分在设备上运行 - 你需要一个新目标来实现这一点。
对不起,这一切都非常复杂,与许多其他单元测试框架相比,这方面的工作仍在进行中。
答案 2 :(得分:0)
上面加里回答的Swift 3翻译(使用URL而不是字符串路径)是:
let url = Bundle(for: type(of: self)).url(forResource: "SimpleTestList", withExtension: "plist")
注意关键和非显而易见的部分 type(of: self)
而不是[self class]
。