如何在测试目标中添加/打开捆绑文件

时间:2013-04-30 23:39:55

标签: ios objective-c xcode nsbundle

我有一个由应用程序链接的静态库。库代码打开一个文件,该文件位于应用程序包中的bundle中,开头完成如下:

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];

这很好。

但是我想在库中添加一些单元测试代码,因此我有一个逻辑测试目标。由于文件位于应用程序的包中而不是静态库的包中,因此我复制了Config.plist文件,并通过Copy Bundle Resources将其添加到测试代码目标中。但是,当我执行测试代码时,无法找到该文件。那是为什么?

由于以上是令人困惑的,这里是工作区结构的摘要。

Workspace contains:
    Application Project with application target, which contains (X)
        Config.plist (a)
    Library project which contains:
        Library target, which contains:
            the code opening the file in the bundle (b)
        Test library target, which contains: (Y)
            A Copy of the Config.plist (c)

所以,如果我构建X,那么当b运行时,它可以找到一个。但是当我在运行时构建Y然后b找不到c。

3 个答案:

答案 0 :(得分:11)

我发现如果我将[Bundle mainBundle]更改为[NSBundle bundleForClass:[self class]],那么它在两种情况下都有效

答案 1 :(得分:0)

您可以在项目库中创建应用程序目标,将该文件复制到该目标,然后在测试库代码的位置创建一个应用程序测试目标(在同一项目中)。

答案 2 :(得分:0)

问题是静态库没有捆绑资源。编译后,它将只包含已编译的代码和头文件。因此,没有要复制的静态库plist资源。

因此,您需要另一个进程来复制库包,使其最终位于构建目录中。

我找到的最有效的方法是在Link Binary With Libraries阶段之前的运行脚本阶段使用脚本执行此操作。我附上了我的一个项目的截图,我必须做类似的事情。您应该能够通过在脚本的第一行调整文件名来实现所需的功能。所有环境变量都是预定义的标准,所以我认为除了这个脚本之外还不需要任何进一步的配置。

尚未测试环境变量是否适用于除默认xCode 4构建位置以外的任何其他内容。

Script to copy resource from static library to Parent Project build directory