28

我一直在关注 Apple 关于为 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 文件,但我没有运气解决该捆绑包,这将为我提供访问文件的路径。我尝试粘贴 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] 也不起作用。

4

3 回答 3

72

好的,所以我想通了。为了在单元测试中打开文件,您需要指定要打开的文件:

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

如果您将它包含在作为单元测试包的一部分编译的类中,该类将在单元测试包中查找文件 SimpleTestList.plist。

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

于 2009-08-03T03:05:35.800 回答
3

如果您需要应用程序委托,您必须在设备本身而不是模拟器上运行单元测试。此外,您将看到单元测试输出出现在控制台中,而不是构建结果中。

要知道的关键是有两种类型的单元测试 - 在可执行文件之外运行的逻辑测试,然后是需要完整运行环境的集成系统类型的测试。

逻辑测试必须在选择模拟器作为目标的情况下运行,否则它们将不会运行。

集成系统测试必须作为可执行文件的一部分在设备上运行 - 您需要一个新目标来完成此操作。

抱歉,这一切都太复杂了,与许多其他单元测试框架相比,这方面的工作仍在进行中。

于 2009-07-07T15:38:54.493 回答
0

上面加里答案的 Swift 3 翻译(使用 URL 而不是字符串路径)是:

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

请注意关键和非显而易见的部分type(of: self),而不是[self class].

于 2016-11-29T18:27:12.727 回答