更新:我最终放弃并将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");
替换这些代码行,即使该类仍在导入,错误也会消失。
答案 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)
好的,所以我也对此进行了斗争,以下是我发现的解决问题的简单方法:
注意,这意味着您只需要在运行测试时编译测试包目标。 理想,不;是的,是的。
Apple真正实现了自动化,让它正常运行,开箱即用。
答案 5 :(得分:0)
我同意GHUnit的建议,它完全是摇滚!
然而,在Apple将其集成到xCode4之后,我已经转而使用OCTest,所以我在讨论这些问题。
我们在向项目添加新文件后,发生了此处报告的链接问题。这些包括ViewControllers和xibs,但文件在xcode中标记为应用程序和测试目标。我通过检查派生数据目录中的OCTest包来发现文件。 〜/ Library / Developer / Xcode / DerivedData /右键单击并从finder中选择“Show Package Contents”。寻找不属于那里的东西,即:应用程序类和资源。从“编译源”或“复制包资源”中删除这些文件更正了链接错误。