【问题标题】:How to add/open a bundle file in a test target如何在测试目标中添加/打开捆绑文件
【发布时间】:2013-04-30 23:39:54
【问题描述】:

我有一个应用程序链接到的静态库。库代码打开应用程序包中的包中的文件,打开方式如下:

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 运行时它可以找到 a。但是当我在运行时构建 Y 时,b 找不到 c。

【问题讨论】:

    标签: ios objective-c xcode nsbundle


    【解决方案1】:

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

    【讨论】:

    • 太棒了。正是我需要的。
    • 搜索了两个小时,结果发生了。干杯!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 静态库没有捆绑包,但静态库的逻辑测试目标有。
      • 然而图书馆项目确实如此。在您上面的配置中,您声明您拥有库项目。再次查看您的配置,我发现我提供的内容不适用于您的设置方式。话虽如此,如果您的库测试目标需要 config plist,您最好将库所需的数据的一份副本存储在库项目的 config.plist 中。然后,您可以使用上述技术将 plist 数据从库中复制到您的主项目中。总体结果应该是一个更加模块化的构建过程。
      • 我说我有一个逻辑测试库,在结构中有一个库项目和一个测试库项目都显示出来,plist 显示为测试库的一部分。不想争论 - 我很感激你的回复。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多