【问题标题】:OCUnit testing an embedded frameworkOCUnit 测试嵌入式框架
【发布时间】:2010-05-19 16:01:17
【问题描述】:

更新:我最终放弃并将 GHUnit 添加到我的项目中。我在几分钟内就开始使用 GHUnit。

更新:您可以在此处下载 Xcode 项目:http://github.com/d11wtq/Cioccolata

我在我的 Xcode 项目中添加了一个单元测试目标,但它在构建时找不到我的框架,说:

Test.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

我的框架(主要项目目标)设计为嵌入式,因此安装路径为@executable_path/../Frameworks

我已将框架标记为测试目标的直接依赖项,并将其添加到“Link Binary with Libraries”构建阶段。

此外,我添加了“复制文件”的第一步(在构建依赖项之后),它只是将框架复制到单元测试包的框架目录。

有人有这方面的经验吗?我不确定我错过了什么。

编辑 |我很确定我不应该这样做,因为框架不可执行,但我没有设置“测试主机”和“捆绑加载器”。这应该(据我所知)一切正常,因为测试包与框架链接,并且会像任何其他包一样加载它。

编辑 |我想我快到了。我阅读了以下文章,该文章规定使用 @rpath 而不是 @executable_path。

http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/

在这种情况下,它非常有意义,因为 OCUnit 测试包不是可执行文件,它是一个普通的旧包,所以 @executable_path 不兼容。所以现在我的框架将其安装目录设置为@rpath,并且测试目标将其运行时搜索路径(rpath)定义为构建目录。这使我不必将框架复制到测试包中,这意味着总体上生成的框架在本质上更加灵活,因为它可以存在于任何地方。

现在,我也意识到我应该在 Test 目标上设置了 Bundle Loader,所以现在将其设置为框架二进制文件的路径。

我可以构建测试目标,并且可以从框架中#import 类,没有错误。但是一旦我尝试从框架中实例化一个类,我就会收到以下错误:

/Developer/Tools/RunPlatformUnitTests.include:412: note: Started tests for architectures 'i386' /Developer/Tools/RunPlatformUnitTests.include:419: note: Running tests for architecture 'i386' (GC OFF) objc[50676]: GC: forcing GC OFF because OBJC_DISABLE_GC is set Test Suite '/Users/chris/Projects/Mac/Cioccolata/build/Debug/Test.octest(Tests)' started at 2010-05-21 12:53:00 +1000 Test Suite 'CTRequestTest' started at 2010-05-21 12:53:00 +1000 Test Case '-[CTRequestTest testNothing]' started. /Developer/Tools/RunPlatformUnitTests.include: line 415: 50676 Bus error "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" /Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Tools/otest' exited abnormally with code 138 (it may have crashed). Command /bin/sh failed with exit code 1

我的测试方法只是分配并随后发布我创建的一个 HelloWorld 类来帮助调试此设置:

- (void)testNothing {
    CTHelloWorld *h = [[CTHelloWorld alloc] init];
    [h release];
}

如果我用STAssertTrue(YES, @"Testing nothing"); 替换这些代码行,错误就会消失,即使类仍在导入中。

【问题讨论】:

  • 你有什么办法可以把你的项目删掉并发布到网上?我非常愿意快速浏览一下。前段时间我遇到过类似的问题,但不记得我到底做了什么。看看一个破碎的项目可能会让我的大脑颤抖。
  • 我现在把它放在 github 上...会在一个勾号中发布。
  • 这里的密码并不多。它甚至还没有开始;)github.com/d11wtq/Cioccolata
  • 我已经放弃了。我下载了 GHUnit 并在大约 10 分钟内启动并运行。相同的测试用例,不同的测试运行器。让工作变得更愉快。
  • 请在此问题中添加“GHUnit”标签。

标签: objective-c xcode cocoa ocunit gh-unit


【解决方案1】:

由于没有其他人提出这个问题,我将在结束时说 SenTestingKit 对我需要的设置的复杂性(和丑陋)真的没有印象。我强烈推荐 GHUnit,它在 UI 中运行(如果您愿意,也可以在命令行上运行)并支持开箱即用的 gdb。在我的项目中下载和使用 GHUnit 花了我几分钟的时间。

也很漂亮。 Apple 应该使用 Xcode 而不是 SenTestingKit 恕我直言。

【讨论】:

  • 来自 Visual Studio + ReSharper 世界,GHUnit 正是医生所要求的。我们必须讨论一下……让 TDD 从业者继续使用 SenTesting 的东西,就像现在用 Xcode 打包的那样,这似乎很残忍。
【解决方案2】:

我遇到了同样的问题,但使用的是 Kiwi 单元测试框架。我的问题是构建设置下没有设置“测试主机”。当我将其设置为 $(BUNDLE_LOADER) 时,一切正常。使用 Xcode 4.5.2 iOS SDK 6.0 验证。

【讨论】:

    【解决方案3】:

    这发生在我身上好几次了。我知道你切换到 GHUnit,但以防万一有人感兴趣:在解决这个问题很长时间后,我意识到 Xcode 只是没有在目标的 Compile 部分添加代码类(.m 文件),而是在目标的复制资源部分。把它移到正确的地方解决了这个问题。

    【讨论】:

      【解决方案4】:

      您可能对以下article 有一些运气,特别是在您的可执行文件中添加 DYLD_FRAMEWORK_PATH 和 DYLD_LIBRARY_PATH 可能会有所帮助。

      【讨论】:

      • 您好,感谢您的链接。我尝试将这些设置添加到测试目标的构建配置中,但我仍然遇到同样的问题。嗯。
      【解决方案5】:

      好的,所以我也为此而战,这是我发现的简单解决方案:

      1. 创建您的应用程序/框架
      2. 创建您的测试包“附加目标”,不要设置对您的主包的依赖
      3. 将要测试的文件从类拖到测试包目标的“编译源”
      4. 创建测试用例,仅将它们添加到测试包目标
      5. 编译测试目标,测试运行。

      注意,这意味着当你想运行你的测试时,你只需要编译你的测试包目标。 理想,不;有效,是的。

      Apple 真正实现了自动化,并使其开箱即用。

      【讨论】:

        【解决方案6】:

        我同意 GHUnit 的建议,它非常棒!

        但是,在 Apple 将 OCTest 集成到 xCode4 之后,我已经切换到使用 OCTest,所以我正在艰难地解决这些问题。

        在我们将新文件添加到项目后,我出现了此处报告的链接问题。这些包括 ViewControllers 和 xibs,但文件在 xcode 中针对应用程序和测试目标进行了标记。我通过检查派生数据目录中的 OCTest 包发现了这些文件。 ~/Library/Developer/Xcode/DerivedData/ 右键单击​​并从查找器中选择“显示包内容”。寻找不属于那里的东西,即:应用程序类和资源。从“编译源”或“复制捆绑资源”中删除这些文件更正了链接错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 2020-05-06
          • 2022-07-28
          • 2013-02-13
          • 2020-06-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多