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