2014-10-20 59 views
1

我在这里经历了很多问题和答案,最终都陷入了困境。XCode 6测试目标问题

既然我对我的项目代码的状态很满意,我想实现单元测试。所以我添加了一个测试目标,我可以正确地编译它吗?不......我确定这很简单,但我无法解决这个问题。

该项目包含2个第三方私有框架。

我的测试目标束装载机参数设置为:

$(TEST_HOST) 

我的测试目标的测试主机的参数设置为:

$(BUILT_PRODUCTS_DIR)/My App.app/Contents/MacOS/My App 

当我尝试编译,我得到的错误是这样的:

Undefined symbols for architecture x86_64: 
    "_OBJC_CLASS_$_MyArrayController", referenced from: 
     objc-class-ref in SMyAppLogicTests.o 

我看这件事,并找到这样的答案: XCTestCase: ld: symbol(s) not found for architecture x86_64

基本上说我需要添加我的类到我的测试目标。这似乎有点击败在工作应用程序的顶部建设点,但嘿。所以我将所有.m文件添加到测试目标,并编译!太棒了,但是,我有新的问题:

Class MyClass is implemented in both /Users/georgebrown/Library/Developer/Xcode/DerivedData/My_App-akedavtbgqpujscilxqmhsvikcku/Build/Products/Debug/My App.app/Contents/MacOS/My App and /Users/georgebrown/Library/Developer/Xcode/DerivedData/My_App-akedavtbgqpujscilxqmhsvikcku/Build/Products/Debug/My App Tests.xctest/Contents/MacOS/My App Tests. One of the two will be used. Which one is undefined. 

这是有道理的,为什么我必须把.m文件中,如果他们已经包含在我的应用程序。所以,我看它,并得到那个把我背在第一位置的答案:

Class Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined

我缺少什么?我一直坚持一个星期试图在xcode中实现测试(更不用说提到xcode服务器对我的服务器做了什么,我仍然必须弄清楚),当我计划用3-4天的时间写愚蠢的想法这将是一个快速设置。

编辑:我删除了我的测试目标,并重新开始。首先不起作用的是,它找不到我的第三部分私有框架。所以我在框架搜索路径中添加了$(PROJECT_DIR)。

接下来,我开始为我的类再次获取架构错误的未定义符号。我注意到我的Bundle Loader没有设置,所以我将它设置为$(TEST_HOST),现在测试运行!万岁。

现在我无法为Run Action构建,但为Test构建了.....进度我猜。我得到架构x86_64的未定义符号:错误再次出现。

我已经设法通过编辑方案解决该问题,并取消选择“运行”以用于构建测试目标。我不确定我完全理解该计划应该如何工作,但是,它的确有窍门。

回答

1

XCTesting thingie的工作原理是在运行时将测试包注入应用程序。当你添加一个新的测试目标时,Xcode负责为你设置所有这些东西:我建议如果你有一个测试目标让你感到悲伤,那么你在Xcode中创建一个新测试目标,然后将你的测试用例转移到目标。 然后你只需要遵循三个原则:

  1. 类实现文件仅添加到应用程序的目标,从来没有 测试任何测试目标。这将阻止“MyApp和MyAppTestCase中实现类Foo,其中一个将被使用。哪一个是未定义的”警告
  2. 仅添加您的XCTestCase文件以测试 目标。
  3. '#import'您在测试用例中使用的每个自定义类的头文件。