3

これらの手順に従って、通常の単体テストバンドルをプロジェクトに正常に追加しました。テストターゲットをビルドして実行でき、1つのサンプルテストが正常に機能します。

特定のクラスをテストしようとすると、物事は下り坂になり始めます。

私のアプリでは、私の.hファイルの多くが.pchファイルに含まれています。また、MyModelは他のクラスと相互作用します。このため、MyModel.hをインポートしてテストで使用すると、他のファイルを読み込めなかったという事実に関連するエラーが多数発生します。これに対する私の回避策は、テストターゲットの.pchファイルに同じファイルを追加し、それらのファイルをテストターゲットの「コンパイルソース」リストに追加することです。

したがって、これらのクラスをテストターゲットと.pchに追加して実行しようとすると、無限ループに陥り、常により多くのファイルが必要になります。最終的にすべての.mをプロジェクトに追加しても、テストの実行は見事に失敗します。

#import "MyModel.h"テストファイルに簡単に書き込んでテストを書き込んだり実行したりできるように、プロジェクトを正しく設定する必要がある方法はありますか?私のプロジェクトがテストを不可能にするような方法で構成されている可能性はありますか?

更新1 カールの提案に従いましたが、ステップ2を通過できません。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_MyModel", referenced from:
      objc-class-ref in BaseUnitTests.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

この時点で、MyModel.mを「ビルドフェーズ/コンパイルソース」に追加し、他のすべての.mファイルをテストターゲットの「コンパイルソース」に追加するという無限の道をたどります。

4

2 に答える 2

1

コードは、特にテストを念頭に置いて作成されていない場合は、テストを困難にする方法で確実に作成できます。しかし、それは不可能ではありません。今、あなたはあなたの輸入品をきれいにする必要があるだけです。私がとるアプローチは

1)テストターゲット以外のすべてのクラス実装(.m)をテストターゲットから削除します-それらはそこにある必要はありません。これを行うには、テストターゲットのビルドフェーズで「ソースのコンパイル」ペインからそれらを削除します。

2)すべてのPCHインポートをテストケースに(一時的に)コピーします。インポートし"MyModel.h"ます。MyModelのインスタンスを取得して、それが適切なクラスではなく、適切なクラスであるかどうかをテストしてみてくださいnil。必要に応じてインポートを追加し続けますが、.mは追加しないでください。

3)これと次のステップはオプションですが、コード内の問題領域が明らかになり、きめ細かいテストを作成できなくなる可能性があるため、これらを強くお勧めします。簡単なテストに合格したら、インポートのクリーンアップを開始します。メインプロジェクトに戻ります。まず最初に、pchから独自のクラスを削除し始めます(ライブラリ/フレームワークタイプのインポートはカウントしません)。ヘッダーをpchから一度に1つずつ削除し、本当に必要なファイルにインポートします。

3a)このプロセスを実行するときは、他のヘッダーファイルからできるだけ少ないファイルをインポートするようにしてください。いくつかの状況では、.hに#importのみを含める必要があります。通常は次のとおりです。1)インポートされたファイルで宣言されたクラスをサブクラス化する2)インポートされたファイルで宣言されたプロトコルを実装する3)インポートされたファイルで定義されたCタイプを参照する。プロトコルとクラスの場合、ヘッダーに@protocolと@classを使用して前方宣言し、実際にメッセージを送信するか、プロパティにアクセスする場所(通常は.m)にのみインポートします。

したがって、この時点で、単一の単体テストとよりクリーンなpchが必要です。今すぐ単体テストでインポートをクリーンアップしてください。テストターゲットに戻り、さらにテストを書き始めます。インターフェイスをより焦点を絞ってテスト可能にすると、ファイルをインポートする必要が少なくなります。お役に立てれば!

于 2012-10-03T23:43:32.083 に答える
1

同じ問題が発生し、メインのアプリターゲットで行うのと同じように、テストターゲットのGCC_PREFIX_HEADERにxxx-Prefix.pchファイルパスを追加するだけで解決しました。

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

于 2016-01-22T05:51:45.313 に答える