CocoaPodsによるXcodeユニットテスト


119

私は過去数日間これで壁に頭をぶつけてきましたが、複数のGoogle / SO / Github検索にもかかわらず、私が抱えている問題の解決策を見つけることができません!

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

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

このpodfileで:

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

または、このpodfileを使用します。

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つが使用されます。どれが未定義か


Firebase Analyticsのみを使用していました。Googleアナリティクスに移行すると、すべてが魅力的に機能します。
marosoaie 2016年

私はまだ自分で試したことはありませんが、ココアポッドを使用せずに手動でFirebaseを含めようとする可能性があります。firebase.google.com/ docs
ios

1
これはまだ問題です
Edward

回答:


84

同じ問題がありました。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

おかげで、私はそれを試したところ、「クラス...は両方に実装されています...」という問題がまだ残っています。
16

1
それは私にとってはうまくいきましたが、それでも私には意味がありません。Firebaseが奇妙な方法でpodspecを設定していることを確認できるのは、これが初めてではありません。twitter.com/dirtyhenry/status/836240557311684608ですが、Firebaseチームは返信しません:(
Dirty Henry

4
この変更を行っても警告はすぐにはクリアされませんでしたが、実行すると解決しましたpod install
blwinters

半分の問題は解決しました。残りの半分は、「$ {PODS_ROOT} / Firebase / Core / Sources」をテストターゲットにビルド設定->ヘッダー検索パス
ArgaPK

この変更を行った後、pod installプロジェクトの依存関係を更新するために実行することを忘れないでください;)
jawad

57

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

target 'MyAppTests' do
    inherit! :complete
end

重要なのは、ビルドするためにファイルや他のハッカーpod updateをコピー.xcconfigする必要なく、リポジトリをチェックアウトしている他の人がいつものように実行できることです。


1
これには、「クラス...は両方に実装されている」という問題もあります
Diogo T

コンパイル時のエラーは消えましたが、実行時にこのエラーが発生しました:clang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用して呼び出しを確認)
CMont

私のためにも働いた!ありがとう:)
smapps

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


1
ありがとう@カニカシャルマ
Rahul K Rajan

34

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

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

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

  2. ビルド設定でヘッダー検索パスの設定を見つけ、オプション1と同じ値をリストに追加します。再帰的に設定する必要はありません。

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


それを試してみたが、同じ警告が引き続き表示された
16

8
Firebase 3.14.0現在、このソリューションは有効ですが、パッチが${PODS_ROOT}/Firebase/Core/Sources
AKM

1
新しい道も私のために働いた!CocoaPods バージョン1.2.0を実行していますがinherit! :search_paths、のテストターゲットにも追加する必要があることを覚えておいてくださいPodfile
Paulo Mattos

2.うまくいきません。Firebase 3.x(最新の4.xではない)の使用
Jonny

問題はここでフォローできます:github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

これを機能させる前の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プロジェクトナビゲーターの[ビルド設定]タブ内。ヘッダー検索パス行を見つけて、次の行をデバッグに追加します

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

ステップ3:端末実行で:

ポッドの更新


7

問題はここの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、テストを実行すると問題解決しました。


1
「PODS_ROOT」って何?
ArgaPK 2017

@ArgaPK cocoapodsが設定する変数です。""の間に書き込んだ内容をXcodeに貼り付けるだけです。本当に最善の方法は、CocoaPodsを> = 1.4.0にアップグレードすることです。
JosephH

1
@JosephHが私のココアポッドを1.5.2に更新しても、残念ながら問題は解決しませんでした。
ステイシースミス

@AnastasiaKovaleva pod installアップグレード後に実行しましたか?
JosephH

@JosephH Runningはpod install私の問題を解決しました!どうもありがとう!
ステイシースミス

4

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

sudo gem install cocoapods --pre


残念ながらそれは私にはうまくいきません...私は私の投票を取り消さなければなりません!
Zeb

申し訳ありませんが、それはあなたが、それは私のために問題を解決した理由は、ないように注意してくださいみんなあなたを助けるとないていなかった...
doovers

私は1.20で運が悪い
UKDataGeek 2017

4

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

私のために働いた解決策は:

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

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


このスレッドで他のすべてを試した後-これが私にとってうまくいく唯一の答えでした。ありがとうございました!
Ali Parr

4

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

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

ここに画像の説明を入力してください

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


2

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


これが私にとって有効な唯一の解決策でした。ありがとう!私はこれを行うPodfileでポストインストール処理を行うことを考えています
SauloT


1

以下のよう@Willは周りの問題に言及したヘッダ検索パス CocoaPodsのインストール後。

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

'必要なモジュール「Firebase」がありません'

私の場合の秘訣は、Analytics-Frameworkを参照するターゲットのビルド設定に次の欠落しているヘッダー検索パスを追加することでした。

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

下の写真を見てください: ヘッダー検索パス

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


1

機能する簡単な方法:

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

    target :MyAppTests
end

0

Missing required module Firebase CocoaPodsソリューションなし

同じ問題が発生したがCocoaPodsを使用していない場合:

Firebaseを使用している場合はFirebase.hmodule.modulemapファイルとフォルダーを含むフォルダーがあります。例えば ​​-YOUR_PROJECT_DIR/Linking

メインプロジェクトのターゲットが正しく機能している場合は、ProjectSettings-> Targetsに移動する必要があります。テスト対象を選択します。User headersパスを検索して追加しますYOUR_PROJECT_DIR/Linking。選択するrecursiveオプションをすると、問題ありません。

詳細については、スクリーンショットを参照してください。

ここに画像の説明を入力してください

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