150

podspecのいくつかのライブラリの機能を使用するプロジェクトのクラスに対してiOSロジックテストを作成しようとしています。Xcodeで提供されている標準の単体テストバンドルを使用しています(ただし、アプリケーションテストではなく、単体テストのみです)。

たとえば、私はマギアレコードを使用しており、そのライブラリをポッドスペックにリンクしています。これは私のワークスペースのポッドプロジェクトに存在し、アプリがシミュレーターまたはデバイスで実行されているときに期待どおりに機能します。ただし、Magical Recordを使用するオブジェクトをテストにリンクしようとすると、MagicalRecordからセレクターが見つからないことを示すリンカーエラーが発生します。ロジックテストバンドルのHEADER_SEARCH_PATHを更新しようとしましたが、CocoaPodsによって作成されたヘッダーディレクトリにハードコーディングしましたが、うまくいきませんでした。

CocoaPodsライブラリを使用しないクラスに対して問題なく単体テストを実行できます。

私はこれについて間違っていますか?コンパイラにCocoaPodsライブラリを表示させるために何か他のことをする必要がありますか?

4

14 に答える 14

225

CocoaPods 1.0は、このための構文を変更しました。これで、次のようになります。

def shared_pods
    pod 'SSKeychain', '~> 0.1.4'
    ...
end

target 'Sail' do
    shared_pods
end

target 'Sail-iOS' do
    shared_pods
end

プレCocoaPods1.0の回答

あなたが使いたいのはlink_withあなたからPodfileです。何かのようなもの:

link_with 'MainTarget', 'MainTargetTests'

その後、pod install再度実行します。

于 2013-07-26T16:00:22.067 に答える
174

私のアプリの主なターゲットがCocoaPodsライブラリから設定を受け取る方法を見て、これを理解しました。CocoaPodsには、Pods.xcconfigという名前の.xcconfigファイルが含まれています。このファイルには、すべてのヘッダー検索パスが含まれています。

プロジェクトナビゲータでプロジェクトを確認し、[情報]タブをクリックすると、上部のセクションにビルド構成が一覧表示されます。さまざまな構成の開示三角形を開くと、メインターゲットの下にポッドが一覧表示されます。ドロップダウンをクリックして、ロジックテストターゲットにもポッドを追加する必要がありました。

構成スナップショット

$(inherited)また、メインターゲットの設定とメインターゲットからの設定をコピー${PODS_HEADERS_SEARCH_PATHS}し、ビルド設定/HEADER_SEARCH_PATHSの下のロジックテストターゲットにコピーする必要がありました。

最後に、ロジックテストターゲットのリンクバイナリとライブラリのビルドフェーズにlibPods.aを追加する必要がありました。

これが他の誰かを助けることができることを願っています。

于 2013-01-25T02:58:22.703 に答える
53

私がここで見つけた解決策がありますCocoaPodsを使用したユニットテスト

Xcodeでプロジェクトファイルを開き、プロジェクト(ターゲットではない)を選択します。右側のパネルに、[構成]というセクションがあります。テストターゲットの[構成ファイルに基づく]列でポッドを選択します。

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

于 2013-05-21T08:12:31.467 に答える
18

ライブラリをテストターゲットにリンクさせる必要があるという他の回答に同意します。しかし、これまでのところ、どの提案も役に立ちませんでした。@fabbがコメントに書いているように、「テストすると、isSubclassOfClass:呼び出しはYESを返すはずの場所でNOを返します。これを説明できる唯一の理由は、依存関係が実際にメインターゲットとテストターゲットの両方にリンクされている場合と、テストターゲットのバンドルの場合です。ローダーはメインバンドルをロードしますが、どのクラスを取るかを決定することはできません。」このスレッドの以前のすべての提案で同じ問題が発生します。

私が仕事に取り掛かった解決策は、Podfileを更新して、メインターゲットとテストターゲットに特定のポッドを定義することでした。

target 'MyTarget' do
   pod 'AFNetworking', '~> 2.5.0'
   pod 'Mantle', '~> 1.5'
end

target 'MyTargetTests' do
   pod 'OCMockito', '~> 1.3.1'
end

テスト固有のポッドを使用していなくても、テストターゲットのポッドを指定する必要がありました。そうしないと、CocoaPodsは必要なリンクロジックをプロジェクトに挿入しません。

このリンクは、私がこの結論に到達するのに役立ったものです。

于 2014-11-27T07:19:51.307 に答える
6

:exclusive => trueアプリケーションテストターゲットでのシンボルの重複エラーを回避するために追加しました。

target 'myProjectTests', :exclusive => true do
   pod 'OCMock', :head
   pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end

link_with 'myProject', 'myProjectTests'

アプリケーションテストターゲットをロジックユニットテストターゲットに変更すると、リンカエラーが発生します。削除する:exclusive => trueと、すべてが再び機能します。

target 'myProjectTests', do
   pod 'OCMock', :head
   pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end

link_with 'myProject', 'myProjectTests'

:exclusive => trueは、外部のすべてdo...endをにリンクするべきではないと述べていますmyProjectTests。これは、アプリケーションテストターゲットでは妥当ですが、ロジックテストターゲットではリンカーエラーが発生します。

于 2014-12-01T06:26:39.210 に答える
6

@KeithSmileyソリューションに従ってlink_withを使用できます。

共通のポッドと各ターゲットの詳細がある場合は、「def」オプションを使用してポッドのグループを定義することをお勧めします。後で排他的ターゲットで「def」を使用します。

def import_pods
    pod 'SSKeychain'
end

target 'MyProjectTests', :exclusive => true do
  import_pods
end

target 'MyProject', :exclusive => true do
  import_pods
  pod 'Typhoon'
end

上記の例では、両方のターゲットに「SSKeychain」を追加し、「MyProject」ターゲットにのみ「Typhoon」を追加しました

于 2015-01-21T21:30:57.020 に答える
5

この問題に対する私の解決策は、Podfileを変更して、このように両方のターゲットにライブラリを含めることでした。

target "MyApp" do  
    pod 'GRMustache', '~> 7.0.2'
end

target "MyAppTests" do
    pod 'GRMustache', '~> 7.0.2'
end

また、swiftを使用しているため、MyApp-Bridging-Header.hファイルを含めるようにテストターゲットを構成する必要もありました。([ビルド設定]タブの[Swiftコンパイラ]グループ内)

于 2014-07-25T12:59:30.073 に答える
4

いくつかのバージョン管理中にいくつかのライブラリファイルを失ったときにも同様のことが起こりました。私はまだポッドにライブラリファイルを見ましたが、実際のコードが欠落しているため、XCodeはそれがなくなったと言いました。残念なことに、「pod install」を実行しても、失われたファイルがすぐに元に戻るわけではありませんでした。

次の手順を実行して、ポッドを手動で取り外して交換する必要がありました。

  1. Podfileからライブラリを削除します
  2. 'pod install'を実行して、ライブラリを完全に削除します
  3. ライブラリをPodfileに戻します
  4. 'podinstall'を再度実行します

これにより、問題のライブラリが元の形式に戻るはずです。

于 2014-03-05T16:54:44.070 に答える
2

libPods.aまた、2回追加すると、次のような厄介なエラーが発生することにも注意してください。

232 duplicate symbols for architecture i386

これを修正するにはlibPods.a、プロジェクトエクスプローラーで参照の1つを削除するだけです。

于 2013-04-16T00:56:57.600 に答える
2

CocoaPods 1.xの時点で、ターゲットと対応するテストターゲット間の共有依存関係を宣言する新しい方法があります。私はこれまでMarkStruzinskiによって受け入れられたソリューションを使用していましたが、この方法を使用すると、テストを実行するときに大量の警告が発生しました。

Class SomeClass is implemented in both /Path/To/Test/Target and /Path/To/App/Target. One of the two will be used. Which one is undefined.

CocoaPods 1.xを使用すると、次のように、-Testターゲットを親ターゲットの検索パスを介して継承するものとして宣言できます。

target 'MyApp' do
    pod 'aPod'
    pod 'anotherPod'
    project 'MyApp.xcodeproj'
end
target 'MyAppTests' do
    inherit! :search_paths
    project 'MyApp.xcodeproj'
end

これにより、-Testターゲットは、複数のバイナリコピーなしで、アプリターゲットの依存関係にアクセスできるようになります。これにより、テストのビルド時間が大幅に短縮されました。

于 2016-11-29T13:16:53.857 に答える
2

これを試してみてくださいそれは私のために働いています、

構成でポッドを設定する必要があります。

Xcodeプロジェクト(プロジェクト)の[プロジェクト]->[情報]->[構成]は、デバッグ、リリース(およびその他の機能)のためにメインプロジェクトの[ポッド]に設定する必要があります。「ヘッダーが見つかりません–検索パスが含まれていません」を参照してください

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

これが誰かの助けになることを願っています。

于 2018-09-12T12:06:05.047 に答える
1

iOSでGoogleMapsObjective-CPODをSwiftアプリと統合しているので、問題は、テストターゲットのビルド設定にブリッジヘッダーファイル( SWIFT_OBJC_BRIDGING_HEADER )への参照がないことでした。サードパーティのAPI呼び出し(マップAPIなど)を迅速な単体テストで使用できるように、アプリとテストアプリの両方のターゲットがそれを指していることを確認してください。

于 2015-08-27T20:37:59.567 に答える
0

次の構文は私にとって最良の結果をもたらします(cocoapod v.1.2.1でテスト済み):

https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349

 target 'App' do
    pod 'GoogleAnalytics' , '~> 3.0'
    pod 'GoogleTagManager' , '~> 3.0'

     pod 'SDWebImage', '~>3.7'
     platform :ios, '8.0'
     use_frameworks!

     target 'App Unit Tests' do
         inherit! :search_paths
     end
 end

これがないと、重複するシンボルについてテストを実行しているときに警告が表示されます。

この後、警告は消えました。

于 2017-04-14T02:57:45.593 に答える
0

XCTestでOpenCVを使用する際に問題が発生しました。Undefined symbols for architecture arm64のようなクラスのリンカーエラーが発生していましcv::Matた。pod 'OpenCV', '~> 2.0'メインターゲットの下を使用してCocoaPodsを介してOpenCVをインストールしています。inherit! :search_pathsOpenCVの依存関係をテストターゲットの下に置いたり、使用したりしようとしても、うまくいきませんでした。abstract_target解決策は、次のようなものを作成することでした。

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

abstract_target 'Shows' do
  pod 'RMVision', path: '../..'
  pod 'RMShared', path: '../../../RMShared'
  pod 'OpenCV', '~> 2.0'

  target 'RMVisionSample' do
    # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
    # use_frameworks!

    # Pods for RMVisionSample
  end

  target 'RMVisionSampleTests' do
    # inherit! :search_paths
    # Pods for testing
  end

  target 'RMVisionBenchmarks' do
    # inherit! :search_paths
    # Pods for testing
  end

end 

また、プロジェクトをクリーンアップし、テスト時に最初からやり直すのに役立つpod deintegrate&コマンドも役立ちます。pod cleanを使用してこれら2つをインストールできます[sudo] gem install cocoapods-deintegrate cocoapods-clean

于 2019-02-10T18:38:38.343 に答える