Xcode单元测试 - 从应用程序包中访问资源?

时间:2010-05-05 17:45:42

标签: iphone objective-c unit-testing xcode bundle

我遇到了一个问题,我想确认我正在以正确的方式做事。

我可以使用SenTestingKit测试来测试简单的东西,这样就行了。我已经设置了一个单元测试包并将其设置为对主应用程序目标的依赖。每当我按下cmd + B时​​,它都会成功运行所有测试。

这是我遇到问题的地方。我有一些XML文件,我需要从资源文件夹加载作为应用程序的一部分。作为一个优秀的单元测试人员,我想围绕这个进行单元测试,以确保它们正确加载。

所以我有一些看起来像这样的代码:

NSString *filePath = [[NSBundle mainBundle] 
    pathForResource:@"foo" ofType:@"xml"];

这在应用程序运行时有效,但在单元测试期间,mainBundle指向错误的包,因此这行代码返回nil。

所以我把它改为使用这样一个已知的类:

NSString *filePath = [[NSBundle bundleForClass:[Config class]] 
    pathForResource:@"foo" ofType:@"xml"];

这也不起作用,因为为了使测试甚至可以编译这样的代码,它Config需要成为单元测试目标的一部分。如果我添加,那么该类的包将成为单元测试包。 (唉!)

我接近这个错误的方式吗?

2 个答案:

答案 0 :(得分:20)

在尝试重现您的问题时,它突然袭击了我:您是否尝试过将资源添加到测试包中?这会给你带来什么问题吗?我做到了这一点,它对我很有用。例如:

代码:

- (void)testBundleLoading {
  NSLog(@"Main Bundle Path: %@", [[NSBundle mainBundle] bundlePath]);

  for (NSBundle *bundle in [NSBundle allBundles]) {
    NSLog(@"%@: %@", [bundle bundleIdentifier], 
                     [bundle pathForResource:@"fire" ofType:@"png"]);
  }
}

输出:

2010-05-05 14:31:05.961 otest[16970:903] Main Bundle Path: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin
2010-05-05 14:31:05.962 otest[16970:903] (null): (null)
2010-05-05 14:31:05.963 otest[16970:903] com.freetimestudios.KayakKingTests: /Volumes/FreeTime/KayakKing/build/Debug-iphonesimulator/KayakKingTests.octest/fire.png

我希望这会有所帮助。

答案 1 :(得分:0)

我遇到了Xcode 4的这个问题,我的问题是我有一个旧的Xcode 3项目,不知怎的,测试目标的信息plist已经丢失了。我在项目中添加了一个新的UnitTests-Info.plist,我突然能够再次检索资源。