OCUnit测试嵌入式框架

5
更新:我最终放弃了,并在我的项目中添加了GHUnit。我在几分钟内就用GHUnit开始工作了。
更新:您可以在此处下载Xcode项目:http://github.com/d11wtq/Cioccolata 我已经为我的Xcode项目添加了一个单元测试目标,但是在构建时,它无法找到我的框架,显示以下内容:
“Test.octest无法加载,因为发生链接错误。很可能是由于dyld无法定位测试包链接的框架或库,可能是因为在链接时框架或库具有不正确的安装路径。”
我的框架(主要项目目标)被设计为嵌入式,因此具有@executable_path/../Frameworks的安装路径。
我将框架标记为测试目标的直接依赖项,并将其添加到“链接二进制文件”构建阶段。
此外,我添加了第一步(在构建依赖项后),即“复制文件”,它只是将框架复制到单元测试包的Frameworks目录中。
有人有过这方面的经验吗?我不确定我错过了什么。
编辑|我很确定我不应该这样做,因为框架不可执行,但我没有设置“测试主机”和“Bundle Loader”。据我所知,这应该是可以的,因为测试包链接了框架,并且将像任何其他包一样加载它。
编辑|我认为我已经接近了。我阅读了以下文章,规定使用@rpath而不是@executable_path。 http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/ 在这种情况下,由于OCUnit测试包不是可执行文件,而是普通的包,因此@executable_path不兼容。因此,现在我的框架具有其安装目录设置为@rpath,并且Test目标具有其运行时搜索路径(rpath)定义为构建目录。这使我无需将框架复制到测试包中,同时意味着生成的框架总体上更加灵活,因为它可以放置在任何地方。
现在,我也意识到我应该在Test目标上设置Bundle Loader,因此现在将其设置为框架二进制文件的路径。
我可以构建测试目标,并且可以无错误地导入来自框架的类。但是,只要我尝试从框架实例化一个类,就会出现以下错误: /Developer/Tools/RunPlatformUnitTests.include:412: 注意:开始测试架构“i386” /Developer/Tools/RunPlatformUnitTests.include:419: 注意:正在运行架构“i386”的测试(关闭GC) objc[50676]: GC:强制关闭GC,因为OBJC_DISABLE_GC已设置 测试套件'/Users/chris/Projects/Mac/Cioccolata/build/Debug/Test.octest(Tests)'于2010-05-21 12:53:00 +1000启动 测试套件'CTRequestTest'于2010-05-21 12:53:00 +1000启动 测试用例'-[CTRequestTest testNothing]'启动。 /Developer/Tools/RunPlatformUnitTests.include: 第415行:50676总线错误"${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" /Developer/Tools/RunPlatformUnitTests.include:451: 错误:测试工具'/Developer/Tools/otest'以代码138异常退出(可能已崩溃)。 /bin/sh命令退出码为1

我的测试方法只是分配并随后释放了一个我创建的HelloWorld类,以帮助调试此设置:

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

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

你能否将你的项目精简并在网上发布吗?我非常愿意快速浏览一下。我曾经遇到过类似的问题,但是不记得当时具体是怎么解决的了。看一下有问题的项目可能会帮助我回忆起来。 - Alex Winston
我现在正在将它上传到Github...马上会发布。 - d11wtq
这里并没有太多机密代码。它甚至还没有开始😉 http://github.com/d11wtq/Cioccolata - d11wtq
我已经放弃了。我下载了GHUnit,大约10分钟就可以运行了。同样的测试用例,不同的测试运行器。使用起来更加愉快。 - d11wtq
请在此问题中添加一个“GHUnit”标签。 - Hugh
迟到总比没有好;我已经打了标记。 - Ben Kreeger
6个回答

4

由于没有其他人回答这个问题,我想说SenTestingKit让我对其复杂性(和丑陋)印象不佳。 我强烈推荐GHUnit,它可以在UI中运行(或者如果您喜欢,则可以通过命令行运行),并支持直接使用gdb。我只用了几分钟就在我的项目中下载和使用了GHUnit。

它也很漂亮。在我看来,苹果应该将其与Xcode一起发布,而不是SenTestingKit。


1
来自Visual Studio + ReSharper世界的开发者,GHUnit正是他们需要的。我们必须要推广它...让TDD的从业者继续使用现在Xcode里捆绑的SenTesting框架,看起来有点残忍。 - Hugh

3

我曾经遇到过与Kiwi单元测试框架类似的问题。我的问题是在构建设置中未设置“测试主机”。当我将其设置为$(BUNDLE_LOADER)时,一切都正常运行。使用Xcode 4.5.2 iOS SDK 6.0进行了验证。


2

这种情况我也遇到过几次。我知道你已经转用GHUnit,但如果有人感兴趣的话:在这个问题上我花了很长时间四处寻找解决方法之后发现,Xcode只是没有将代码类(.m文件)添加到目标的编译部分,而是添加到了目标的复制资源部分。将其移动到正确的位置就可以解决问题。


1

你可以尝试阅读以下文章,特别是将DYLD_FRAMEWORK_PATH和DYLD_LIBRARY_PATH添加到你的可执行文件中可能会有所帮助。


嗨,谢谢提供链接。我尝试将这些设置添加到测试目标的构建配置中,但仍然遇到相同的问题。嗯。 - d11wtq

1

好的,我也曾经和这个问题斗争过,以下是我发现的解决问题的简单方法:

  1. 创建你的应用程序/框架
  2. 创建你的测试包“additional target”,不要设置依赖于你的主要目标
  3. 将你想要测试的文件从你的类中拖到测试包目标的“编译源”中
  4. 创建你的测试用例,只添加到测试包目标中
  5. 编译测试目标,运行测试。

请注意,这意味着你只需要在想要运行测试时编译你的测试包目标。 理想情况下,不是最好的选择;但是它可以工作。

苹果公司真的应该自动化这个过程,并让它正确地工作。


0

我完全同意使用GHUnit的建议,它非常棒!

然而,自从苹果在xCode4中集成了OCTest后,我已经转而使用它,所以我正在解决一些问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接