5

更新:我最终放弃并将 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");为错误消失,即使该类仍在导入中。

4

6 回答 6

4

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

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

于 2010-05-23T22:49:04.383 回答
3

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

于 2012-11-15T07:42:45.687 回答
2

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

于 2010-09-25T11:22:22.927 回答
1

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

于 2010-05-19T16:34:57.787 回答
1

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

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

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

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

于 2010-10-23T13:17:39.583 回答
0

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

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

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

于 2011-07-18T04:15:13.140 回答