代码之家  ›  专栏  ›  技术社区  ›  d11wtq Vadim Baryshev

OCUnit测试嵌入式框架

  •  5
  • d11wtq Vadim Baryshev  · 技术社区  · 16 年前

    最新消息:我最终放弃了,把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 .

    我将框架标记为测试目标的直接依赖项,并将其添加到“链接二进制与库”构建阶段。

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

    有人对此有经验吗?我不知道我错过了什么。

    编辑我很确定我不应该这样做,因为框架是不可执行的,但我没有设置“测试主机”和“捆绑加载程序”。这应该(在我的理解中)都是正常的,因为测试包与框架相链接,并且将像其他包一样加载它。

    编辑我想我快到了。我阅读了下面的文章,它指示使用@rpath而不是@executable_path。

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

    在这种情况下,这是完全合理的,因为ocUnit测试包不是可执行的,它是一个普通的旧包,所以@executable_path不兼容。所以现在我的框架的安装目录设置为 @rpath 测试目标的运行时搜索路径(rpath)定义为构建目录。这就省去了将框架复制到测试包中的必要性,意味着总体上,生成的框架在本质上更加灵活,因为它可以在任何地方生存。

    现在,我也意识到 应该 已经在测试目标上设置了包加载程序,所以现在将其设置为框架二进制文件的路径。

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

    /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"); 即使类仍在导入,错误也会消失。

    6 回复  |  直到 13 年前
        1
  •  4
  •   d11wtq Vadim Baryshev    16 年前

    由于没有其他人参与这个问题,我最后会说SentestingKit真的没有让我对我需要的复杂(和丑陋)的设置感到印象深刻。我强烈推荐在用户界面(或者命令行)中运行并支持开箱即用的gdb的GHUnit。在我的项目中,我花了几分钟的时间下载和使用ghUnit。

    它也很漂亮。苹果应该用Xcode而不是SentingKit Imho来发货。

        2
  •  3
  •   Ciryon    13 年前

    我也遇到了同样的问题,但是使用了Kiwi单元测试框架。我的问题是“测试主机”没有在生成设置下设置。当我把它设置为$(bundle_loader)时,一切都工作得很好。使用xcode 4.5.2 iOS SDK 6.0进行验证。

        3
  •  2
  •   Aviad Ben Dov    15 年前

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

        4
  •  1
  •   Alex Winston    16 年前

    你可能在以下方面有点运气 article ,尤其是将dyld_框架路径和dyld_库路径添加到可执行文件中可能会有所帮助。

        5
  •  1
  •   Dave Raymer    15 年前

    好吧,所以我也和这个做了斗争,我发现这是解决这个问题的简单方法:

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

    注意,这意味着您只需在想要运行测试时编译测试包目标。 理想,不;工作,是的。

    苹果公司真的实现了这一点的自动化,并使其正常工作。

        6
  •  0
  •   levous    15 年前

    我同意GHUnit的建议,它简直太棒了!

    然而,在苹果将Octest集成到Xcode4之后,我已经转向使用Octest,因此我正在努力解决这些问题。

    在我们向项目添加新文件后,这里报告的链接问题出现在我身上。这些文件包括viewcontrollers和xib,但这些文件在Xcode中被标记为应用程序和测试目标。我通过检查派生数据目录中的octest包发现了这些文件。~/library/developer/xcode/deriveddata/右键单击并从finder中选择“显示包内容”。寻找不属于那里的东西,例如:应用程序类和资源。从“编译源”或“复制捆绑资源”中删除这些文件可以更正链接错误。