在Xcode 6中建立的旧项目中找不到XCTest / XCTest.h


82

我有一些项目正在尝试使用Xcode 6 Beta 2构建。这些项目都具有某种类型的使用XCTest的库(Kiwi / XCTest和Specta),它们无法在Xcode 6中构建,因为XCTest / XCTest.h无法被发现。

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

我注意到XCTest.framework不再位于“使用二进制文件链接库”构建阶段列表中,但这很好,因为当我用Xcode 6创建一个项目时,它似乎自动链接了该库。

也许有些相关性,我所有需要XCTest的依赖项都是通过Cocoapods引入的。

有什么我不知道需要更新项目的东西吗?

Answers:


142

注意: Xcode 7中创建的任何项目可能都不需要这样做。

CocoaPods在这里这里都对此进行了修复


为了解决任何CocoaPod依赖关系,您需要FRAMEWORK_SEARCH_PATHS在需要XCTest的任何Pod目标(例如Kiwi,Specta,FBSnapshotTestCase等)中添加以下内容。

$(PLATFORM_DIR)/Developer/Library/Frameworks

屏幕截图

这将使您可以在可能具有的任何依赖关系中引用XCTest。此问题可能会在以后的CocoaPods或您引用的Pod中修复,因此您可能希望稍后将其删除。

它对Xcode的早期版本无害,因此应该安全使用。


谢谢squarefrog。相关问题在这里
fatuhoku

1
何时计划下一个版本?
fatuhoku

6
这似乎不适用于xcode 6 GM中的KIM。
托马斯(Thomas)Clowes'Sep

3
我不同意“与Xcode 7不相关”。我在Xcode 7.1中遇到问题。按照上述指示添加了框架搜索路径后,问题消失了。我认为从Xcode 7开始的项目不会有问题,但是这里的问题是在较新的Xcode中构建较旧的项目。
杰里·克里诺克

1
从XCode 9开始,您应该将FRAMEWORK_SEARCH_PATHS构建设置设置为$(DEVELOPER_FRAMEWORKS_DIR)和$(继承)
berbie

40

我正在一个项目中移动文件。您要做的就是选择测试文件xxxTests.m等,然后file inspector选择targetas作为test而不是常规目标。


1
确实发生在我身上。我没有注意到,当我移动它时,文件的目标“已更改”。我应该基于它的移动方式(在Xcode中删除并重新添加)来考虑它。谢谢。
chadbag '16

1
简单的答案对我有用。重命名文件时出现问题,这就是我的解决方案。
西蒙(Simon)

17

我注意到XCTest仅可用于测试目标(在Xcode 6中)。如果将XCTest用于任何其他目标(无论出于何种原因),您将看到XCTest.h not found错误。


而已。Cocoapods创建静态库项目/目标。好发现!
Erik Kerber 2014年

1
您很可能需要将所有XCTest相关的代码移至测试目标。
穆斯塔法2014年

如果您使用CocoaPods在项目中包含Kiwi或Specta,这将很困难。
squarefrog

2
那么...解决方法是什么?
fatuhoku 2014年

12

当您添加了在测试目标之外使用XCTest的文件时,会出现此错误。要在AppCode中解决此问题,您可以右键单击任何可疑文件,然后选择“管理目标”,然后确保仅检查了测试目标。


我已经不止一次遇到这个问题。
pshah

在项目中移动文件并在错误的目标下重新添加文件后,这发生在我身上。
吉尔斯,2015年

11

@squarefrog有正确的答案,但是每次更新Pod时,您都必须手动继续这样做:(

如果将其添加到Podfile,它将自动为您添加额外的路径。例如,如果您想为Specta添加$(PLATFORM_DIR)/Developer/Library/FrameworksFRAMEWORK_SEARCH_PATHS

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end

请注意,您可能需要更改"Pods-Tests-Specta"以匹配您的项目设置,或者仅使用@squarefrog建议的循环遍历每个目标。
pix0r

1
我猜错了-@squarefrog没有建议循环。我的意思是将@deanWombourne解决方案中的2-3行替换为:installer.project.targets.each do |target遍历所有目标并应用更改。
pix0r

2

从构建阶段导入XCTest框架并解决该问题后,我也遇到了同样的问题。

构建阶段-> XCTest.Framework>清理并运行。我希望这会对某些人有所帮助。

供您参考...将XCTest导入到现有项目中


这对我有用,但是我还必须转到新测试的“目标设置”,然后在“常规”选项卡上选中用于测试应用程序API的框。
Fran K.

1

在撰写本文时,最新版本的Cocoapods(0.33.1)尚未解决此问题。

但是最先进的版本可以。

按照本指南从源头设置最新版本的Cocoapods。我称呼我的pod-dev(在指南中包含)以区别于宝石安装的Pod。

这种方法的好处是您在Podfile中不需要额外的脚本。您只需要记住要做一个pod-dev install而不是通常的操作即可pod install


1

拥有XCTest的最佳方法是从Test Nagigator(左窗格中的第5个图标)添加它。

这样,新的xx.m测试文件就不会定位(在右窗格中)应用程序(在左窗格中> Target,包装扩展程序:app),而是一个捆绑包(包装扩展程序:xctest)

  • XCTest.framework保持为红色,
  • 由于某些修改,您可能会遇到错误'XCTest/XCTest.h' file not found,这是因为您的文件必须以应用为目标。

0

这是我发现的最简单的解决方法。无需更改项目。并且此更改将持续到下一次Xcode升级:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework

这样做的缺点是,如果每次Xcode更新时,您都必须与他人共享您的项目,则必须让他们执行此操作。这是Cocoapods实施的问题,因此使用Cocoapods解决该问题很有意义!
squarefrog

同意 这并不完美。但这确实很容易,并且可以根据您拥有的Pod的数量进行扩展(O(1))。最好也限制Xcode 6版本的数量:-)
Steven Kramer 2014年

将路径添加到框架搜索路径似乎并没有减少它:测试将建立,但不会运行。显然是由于测试包无法解析XCTest框架。
史蒂文·克雷默

0

在没有Cocoapods的项目中(因此不能直接回答OP的问题,但将来可能对我或其他人有所帮助),我们遇到了同样的问题。通过用XCTest替换我们以前的OCTest项目可以解决此问题。例如,文件MyApp.xcodeproj / project.pbxproj具有此diff(缩短); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.