Xcode6でビルドされた古いプロジェクトでXCTest / XCTest.hが見つかりません


82

Xcode 6 Beta 2でビルドしようとしているプロジェクトがいくつかあります。XCTest/ XCTest.hではビルドできないため、Xcode 6ではビルドされないXCTest(Kiwi / XCTestおよびSpecta)を使用するライブラリがすべてのプロジェクトにあります。見つけられた。

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

XCTest.frameworkが「LinkLibrarieswith Binaries」ビルドフェーズリストに含まれていないことに気付きましたが、Xcode 6で新しいプロジェクトを作成すると、ライブラリが自動的にリンクされているように見えるため、問題ありません。

おそらくいくつかの関連性がありますが、XCTestを必要とする依存関係はすべてCocoapodsを介してもたらされます。

プロジェクトで更新する必要があることに気付いていないことはありますか?

回答:


142

注:これは、Xcode7で作成されたプロジェクトでは必要ない場合があります。

CocoaPodsはここここでこれを修正しました


CocoaPodの依存関係についてこれを修正するには、XCTestを必要とするFRAMEWORK_SEARCH_PATHSポッドターゲット(Kiwi、Specta、FBSnapshotTestCaseなど)に以下を追加する必要があります。

$(PLATFORM_DIR)/Developer/Library/Frameworks

スクリーンショット

これにより、依存関係のあるXCTestを参照できるようになります。これは、CocoaPodsまたは参照しているポッドの将来のアップデートで修正される可能性があるため、後で削除することをお勧めします。

以前のバージョンのXcodeに悪影響を与えることはないため、安全に使用できます。


スクエアフロッグありがとうございます。関連する問題はここに
fatuhoku 2014

1
次のリリースはいつ予定されていますか?
fatuhoku 2014

6
これは、xcode 6GMのKIMでは機能しないようです。
Thomas Clowes 2014

3
「Xcode7には関係ありません」に同意しません。Xcode7.1で問題が発生しました。上記のようにフレームワーク検索パスを追加した後、問題は解消されました。Xcode 7で開始されたプロジェクトには問題がないと思いますが、ここでの問題は、新しいXcodeで古いプロジェクトをビルドすることです。
ジェリークリノック2015

1
XCode 9以降、FRAMEWORK_SEARCH_PATHSビルド設定を$(DEVELOPER_FRAMEWORKS_DIR)および$(継承)に設定する必要があります
berbie 2018

40

プロジェクト内のファイルを移動していました。あなたがしなければならないのは、テストファイルを選択しているxxxTests.m中などをし、file inspector選択targetとしてtestではなく、通常のターゲットとして。


1
まさに私に何が起こったのか。移動したときに、ファイルのターゲットが「変更された」ことに気づきませんでした。移動方法(Xcodeで削除して再追加)に基づいて考える必要がありました。ありがとう。
chadbag 2016

1
私のために働いた簡単な答え。ファイルの名前を変更するときに問題が発生しました。これが私の場合の解決策でした。
サイモン

17

XCTestはテストターゲット(Xcode 6)でのみ使用できることに気づきました。(何らかの理由で)他のターゲットにXCTestを使用している場合は、XCTest.h not foundエラーが表示されます。


それでおしまい。Cocoapodsは静的ライブラリプロジェクト/ターゲットを作成します。良い発見!
Erik Kerber 2014年

1
ほとんどの場合、XCTest関連のすべてのコードをテストターゲットに移動する必要があります。
ムスタファ

CocoaPodsを使用してプロジェクトにKiwiまたはSpectaを含める場合、これは困難です。
squarefrog 2014

2
だから...修正は何ですか?
fatuhoku 2014

12

このエラーは、XCTestがテストターゲットの外部で使用されているファイルを追加した場合に発生します。AppCodeでこれを修正するには、疑わしいファイルを右クリックして[ターゲットの管理]を選択し、テストターゲットのみがチェックされていることを確認します。


私はこの問題に何度も遭遇しました。
pshah 2015年

これは、プロジェクト内でファイルを移動し、間違ったターゲットの下にファイルを再度追加した後に発生しました。
ジャイルズ

11

@squarefrogは正しい答えを持っていますが、ポッドを更新するたびに手動でそれを続ける必要があります:(

これをポッドファイルに追加すると、追加のパスが自動的に追加されます。たとえば、Spectaに追加$(PLATFORM_DIR)/Developer/Library/Frameworksしたい場合FRAMEWORK_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 2014

1
私は間違って話しました-@ squarefrogはループを提案しませんでした。つまり、@ deanWombourneのソリューションの2〜3行目を次のように置き換えinstaller.project.targets.each do |targetます。すべてのターゲットをループして変更を適用します。
pix0r 2014

2

ビルドフェーズからXCTestフレームワークをインポートして問題を解決した後、同じ問題に直面しました。

ビルドフェーズ-> XCTest.Framework>クリーンアンドラン。誰かのお役に立てば幸いです。

参考までに... XCTestを既存のプロジェクトにインポートします


これは私にとってはうまくいきましたが、新しいテストのターゲット設定に移動し、[全般]タブでアプリのAPIをテストするためのチェックボックスをオンにする必要がありました。
フランK.

1

執筆時点では、Cocoapodsの最新バージョン(0.33.1)には問題の修正がありません。

しかし、最先端のバージョンはそうです。

このガイドに従って、Cocoapodsの最新バージョンをソースから設定してください。pod-dev宝石がインストールされたバージョンのポッドと区別するために、私は(ガイドで説明されている)私のものと呼んでいます。

このアプローチの利点は、Podfileに追加のスクリプトを作成する必要がないことです。pod-dev install通常の代わりに行うことを覚えておく必要がありpod installます。


1

XCTestを使用する最良の方法は、Test Nagigator(左側のペインの5番目のアイコン)から追加することです。

そのように動作すると、新しいxx.mテストファイルは(右側のペインで)アプリ(左側のペイン> [ターゲット]、ラッパー拡張機能:アプリ)ではなく、バンドル(ラッパー拡張機能: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 2014

同意しました。そして、これは完璧ではありません。しかし、それは本当に簡単で、あなたが持っているポッドの数(O(1))にうまく対応します。Xcode6バージョンの数も制限したほうがよいです:
Steven Kramer

フレームワークの検索パスにパスを追加しても、それがうまくいかないようです。テストはビルドされますが、実行されません。どうやら、テストバンドルがXCTestフレームワークを解決できないことが原因です。
Steven Kramer

0

Cocoapodsのないプロジェクト(OPの質問に直接答えることはありませんが、将来私や他の人に役立つかもしれません)でも、同じ問題が発生しました。以前のOCTestアイテムをXCTestに置き換えることで解決しました。たとえば、ファイルMyApp.xcodeproj / project.pbxprojには、この差分(短縮)があります。 - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.