OCUnit测试嵌入式框架

时间:2010-05-19 16:01:17

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

更新:我最终放弃并将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”构建阶段。

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

有人对此有任何经验吗?我不确定我错过了什么。

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

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

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

在这种情况下,它非常有意义,因为OCUnit测试包不是可执行文件,它是一个普通的旧包,所以@executable_path不兼容。所以现在我的框架将其安装目录设置为@rpath,并且Test目标将其运行时搜索路径(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");替换这些代码行,即使该类仍在导入,错误也会消失。

6 个答案:

答案 0 :(得分:4)

由于没有其他人在讨论这个问题,我最后会说SenTestingKit对我的需求设置的复杂性(和丑陋)真的不感兴趣。我强烈推荐GHUnit在UI中运行(或者在命令行上运行,如果你愿意的话)并且支持使用开箱即用的gdb。我花了几分钟的时间在我的项目中下载和使用GHUnit。

它也很漂亮。 Apple应该使用Xcode代替SenTestingKit IMHO。

答案 1 :(得分:3)

我遇到了同样的问题但是使用了Kiwi Unit Testing框架。我的问题是“测试主机”未在“构建设置”下设置。当我将它设置为$(BUNDLE_LOADER)时,一切都很完美。使用Xcode 4.5.2 iOS SDK 6.0验证。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可能会对以下article感到满意,特别是在您的可执行文件中添加DYLD_FRAMEWORK_PATH和DYLD_LIBRARY_PATH可能有所帮助。

答案 4 :(得分:1)

好的,所以我也对此进行了斗争,以下是我发现的解决问题的简单方法:

  1. 创建您的应用程序/框架
  2. 创建测试包“附加目标”,不要设置对主
  3. 的依赖
  4. 将要测试的文件从类中拖动到测试包目标的“编译源”
  5. 创建测试用例,仅将其添加到测试包目标
  6. 编译测试目标,测试运行。
  7. 注意,这意味着您只需要在运行测试时编译测试包目标。 理想,不;是的,是的。

    Apple真正实现了自动化,让它正常运行,开箱即用。

答案 5 :(得分:0)

我同意GHUnit的建议,它完全是摇滚!

然而,在Apple将其集成到xCode4之后,我已经转而使用OCTest,所以我在讨论这些问题。

我们在向项目添加新文件后,发生了此处报告的链接问题。这些包括ViewControllers和xibs,但文件在xcode中标记为应用程序和测试目标。我通过检查派生数据目录中的OCTest包来发现文件。 〜/ Library / Developer / Xcode / DerivedData /右键单击并从finder中选择“Show Package Contents”。寻找不属于那里的东西,即:应用程序类和资源。从“编译源”或“复制包资源”中删除这些文件更正了链接错误。