web-dev-qa-db-ja.com

Cocoapodsを使用したXcodeユニットテスト

過去数日間、これで頭を壁にぶつけていましたが、Google/SO/Githubで複数回検索しても、問題の解決策が見つかりません!

私がやろうとしているのは、Firebaseポッドを使用するアプリのユニットテストを作成することだけです。

Xcode 7.3.1とCocoapods 1.0.1を使用しています。 更新: Xcode 8.0で問題が残る

このポッドファイルでは:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

私のXCTestクラスでは

必須モジュール「Firebase」がありません

@testable import MyAppのエラー

または、このポッドファイルを使用して:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

テストはビルドされますが、コンソールに次のような警告が散らばっています:

クラス<-FirebaseClassName->は... MyApp ...と... MyAppTests ...の両方で実装されます。2つのうちの1つが使用されます。未定義のもの

102
doovers

私にとっての解決策は、cocoapodsをバージョン1.1.0.rc.2に更新することでした。

Sudo gem install cocoapods --pre

3
doovers

同じ問題がありました。 pod 'Firebase'をテストターゲットに移動して解決しました。 Podfileを次のように変更します。

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end
76
Mackarous

次のように、継承を:completeに変更してみてください。

target 'MyAppTests' do
    inherit! :complete
end

重要なことは、あなたのレポジトリをチェックアウトしている誰かが、pod updateファイルや他のハッカーをコピーするだけで通常通り.xcconfigを実行できるようにすることです。

53
Andy Chou
  1. 単体テストのターゲット設定を選択します。
  2. ビルド設定に移動します。
  3. ヘッダー検索パスを探します。
  4. この値$(SRCROOT)/ Podsを再帰的に追加すると、Xcodeがパスを解決します。

43
Kanika Sharma

問題は、CocoaPodsが設定に対して独自の値を生成した後、Firebaseがヘッダー検索パスで特別な処理を行うため、CocoaPodsがテストターゲットに引き継ぐためにこの変更を認識しないことです。次の2つの方法のいずれかを解決できます。

  1. ファイルナビゲータでMyAppTests.<configuration>.xcconfigを見つけて、次をHEADER_SEARCH_PATHSに追加します。

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  2. Build SettingsでHeader Search Pathsの設定を見つけて、オプション1と同じ値をリストに追加します。再帰的に設定する必要はありません。

* AKMのコメントによると、これはバージョン3.14.0で${PODS_ROOT}/Firebase/Core/Sourcesに変更されました

33
Will

この問題は、firebaseプロジェクトの次の場所に記録されています。

https://github.com/firebase/firebase-ios-sdk/issues/58

回避策があります:

「$ {PODS_ROOT}/Firebase/Core/Sources」を、ビルド設定->ヘッダー検索パスのみでテストターゲットに追加します

しかし、これはCocoaPods 1.4.0以降にアップグレードすることで修正されます。これはより良いソリューションです。

これを書いている時点(2017年11月)cocoapods 1.4.0はまだベータ版であるため、それをインストールするには、ベータ版を明示的に要求する必要があります。

gem install cocoapods --pre

これとpod installを実行することで、テストの実行に関する問題が解決しました。

7
JosephH

これを機能させるための3つのステップ:

CocoaPods:1.5.0 Swift 4 Firebase:4.13.0

ステップ1:ポッドファイルに次のターゲットブロックを追加してください。

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

ステップ2:YourAppTests Project Navigatorの[ビルド設定]タブ内。ヘッダー検索パス行を見つけて、次の行をデバッグに追加します

$(継承)$ {PODS_ROOT}/Firebase/Core/Sources

ステップ3:ターミナルでの実行:

ポッド更新

6
Dennis

上記のすべてを試してみましたが、最初はMissing required module 'Firebase'で始まり、テストターゲットにFirebase Podを追加しようとすると"Class ... is implemented in both ... "またはリンカーの問題が発生し、さまざまなエラーに遭遇しました。

私のために働いた解決策は次のとおりでした:

  1. テスト対象をPodfileから完全に削除し、「pod update」を実行して、XCodeプロジェクトが同期していることを確認します。
  2. テストターゲットのビルド設定を開き、ヘッダー検索パスを更新して、次の3つの項目のみを含めます。
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

この時点で、ビルドフォルダーをクリーンアップし、再ビルドしてからテストを再実行するとうまくいきました。これが誰かを助けることを願っています!

同様の問題がありました。あなたの質問に関して、私はMyApp.<configuration>.xcconfigファイルの内容をMyAppTests.<configuration>.xcconfigファイルにコピーしました。私はテストをきれいにしてビルドしましたが、うまくいきました。

2
Jason

"$ {PODS_ROOT}/Firebase/Core/Sources"Build Settings-> Header Search Pathsの下のTestsターゲットにのみ追加します

1

@ Will は、CocoaPodsのインストール後のHeader Search Pathsに関する問題について言及しました。

私は、ポッド「Firebase」が個別のモジュールに埋め込まれている複数のターゲットを持つプロジェクトを持っています、MyProject-Sharedと言います。 「MyProject-Shared」ターゲットにのみインストールされた「Podfile」のFirebaseポッド。 「MyProject-Shared」を使用する他のモジュールは、エラーのためコンパイルできません。

'必須モジュール「Firebase」が見つかりません'

私の場合のトリックは、eachターゲットのBuild SettingsAnalytics-Frameworkを参照:

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

下の写真をご覧ください: Header Search Path

それがあなたの時間を節約することを願っています。

${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesを単体テストターゲットの「ヘッダー検索パス」に追加すると、問題が修正されました。手順:

  1. 単体テストのターゲットを選択します
  2. ビルド設定に移動します
  3. ヘッダー検索パスを検索します
  4. 追加$ {SRCROOT}/Pods/Firebase/CoreOnly/Sources

enter image description here

この後、テストを実行でき、エラーが消えます。

0