代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

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

  •  15
  • Ben Scheirman  · 技术社区  · 14 年前

    我遇到了一个问题,我想确认我做的事情是正确的。

    我可以用我的感官测试工具测试简单的东西,这没问题。我已经设置了一个单元测试包,并将其设置为依赖于主应用程序目标。每当我按下Cmd+B,它就成功地运行所有测试。

    这就是我遇到问题的地方。作为应用程序的一部分,我需要从resources文件夹中加载一些XML文件。作为一个好的单元测试人员,我想围绕这个编写单元测试,以确保它们正确地加载。

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

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

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

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

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

    这也不起作用,因为为了让测试能够编译这样的代码,它 Config 需要是单元测试目标的一部分。如果我添加它,那么该类的包将成为单元测试包。(哎哟!)

    我是不是走错了路?

    2 回复  |  直到 13 年前
        1
  •  20
  •   Nathan Eror    14 年前

    当试图重现您的问题时,我突然想到:您是否尝试将您的资源添加到您的测试包中?这会给你带来什么问题吗?我确实做到了,这对我很有用。例如:

    代码:

    - (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
    

    我希望这有帮助。

        2
  •  0
  •   Ciryon    13 年前

    我在xcode 4中遇到了这个问题,我的问题是我有一个旧的xcode 3项目,不知怎么的,测试目标的信息plist丢失了。我在项目中添加了一个新的unittests-info.plist,我突然又能检索到资源。