Xcode 7ベータ5に最近更新しました。以前のプロジェクトに単体テストを追加しようとしましたが、@testable import myModuleName
行に「No such module [myModuleName]」というエラーメッセージが表示されます。
私は試した
これはこのプロジェクトでは機能しませんでした(ただし、別のプロジェクトで動作するようにテストしました)。他の誰かがこの問題を抱えて解決しましたか?
私のために働いた答え
答えは、ビルドに失敗していたプロジェクトにエラーがあったことです。 (これは、コードの毎日の標準バグでした。)エラーを修正し、別のクリーンアップとビルドを行った後、動作しました。
これらのエラーは最初は表示されなかったことに注意してください。それらを表示するには:
他のエラーがある場合は、すぐに表示されます。それらを修正してから、テストファイルコードのコメントを外します。 「そのようなモジュールはありません」というエラーは、私にとってはなくなりました。
これで他の人の問題が解決しない場合は、次のことも試してください。
ビルドフォルダーのクリーンアップ
製品メニューを開き、押し続けます Option、[ビルドフォルダのクリーン...]をクリックします
Enable TestabilityがYesに設定されていることを確認してください
Project Navigatorでプロジェクト名をクリックします。 [ビルド設定]を選択し、[ビルドオプション]まで下にスクロールします。 Enable TestabilityがYes(デバッグ用)であることを確認してください。
テストターゲットを削除して再追加します
他のことを行った場合、おそらくこれを行う必要はないでしょう。しかし、もしそうなら、すでに書いたユニットテストを保存することを忘れないでください。
Project Navigatorでプロジェクト名をクリックします。次に、テストターゲットを選択します。下部のマイナス(-)ボタンをクリックして削除します。
次に、プラス(+)ボタンをクリックし、iOS Unit Testing Bundleを選択して再度追加します。ご覧のとおり、同じ方法でUIテストバンドルを追加することもできます。
他のいくつかのアイデア
または...
他に機能するものを見つけた場合は、下にコメントまたは回答を残してください。
関連
@testable import "ModuleName"
でインポートしようとするモジュール名を確認してください。モジュール名はTarget->Build Settings-> Product Module Name
で同じである必要があります
私にとっての問題は、テストのiOS展開ターゲットがメインターゲットと同じに設定されていないことでした。これを必ず確認してください。
テスト対象:
Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
これが、以前の提案から提案されたすべての解決策を試した後、コードを機能させる方法です。
そしてすべてが魅力のように働きました。お役に立てれば。
注意すべき点は、モジュール名に-
というダッシュ文字が含まれている場合は、_
ではなくアンダーバーを使用して参照する必要があるということです。何らかの理由で、これが問題になるのではないかと疑いました。
例えば。 @testable import Ocean-Swift
は@testable import Ocean_Swift
になります
もう1つだけ、@testable
構文を使用する場合は、テスト対象に実動コードを含めないでください。これは不可解な奇妙さを引き起こすことがわかった。
これは、両方のターゲットのビルド設定に関するエラーのようです。以下を確認する必要があります。
ENABLE_TESTABILITY
は両方のターゲットでYesに等しくなります。PRODUCT_MODULE_NAME
値は、アプリケーションのものとは異なる必要があります。確認すべきもう1つのこと:Objective-Cプロジェクトがあり、Swiftで単体テストを作成している場合、メインターゲットが少なくとも1つのSwiftファイルを使用していることを確認してください!
詳細:
私はObjective-Cプロジェクトに取り組んでいましたが、Swiftでユニットテストを書きたいと思っていました。
Swiftファイルをメインターゲットに追加して、必要なProjectName-Bridging-Header.hファイルを生成し、テストを作成したところ、すべてが正常に機能していました。
後で不要だと思ったため、Swiftファイルを削除しました(メインターゲットのコードはすべてObjective-Cにあります...私はSwiftでテストを書いているだけです)。
「クリーン/クリーンビルドフォルダー」を実行し、「そのようなモジュールはありません」という問題が表示された後、問題が発生するまで気付きませんでした。頭をひっかいてから、新しい空のSwiftファイルを追加すると、問題はなくなりました。
私はSwiftファイルの有無にかかわらず何度もテストしましたが、それだけで動作します...そのため、プロジェクトに空白ファイルを残すか、Objective-CをSwiftに変換するか、いくつかを追加する必要がありますSwiftで書かれたプロジェクトの新しいコード。
これと同じ問題がありました。ビルドフォルダーのクリーニングとXcodeの再起動は機能しませんでした。
私にとってうまくいったのは、テストターゲットとスキームの「アクティブアーキテクチャのみをビルド」の設定が、アプリのターゲットとスキームの設定と一致するようにすることでした。
私の問題は、テストしたいクラスが別のモジュール(APIクライアント)にあるはずでしたが、クラスは実際にはフレームワークターゲットではなくアプリターゲットのメンバーであるということでした。クラスのターゲットメンバーシップを変更すると、インポートエラーがなくなりました。
私の解決策は、ビルド設定/パッケージ/製品名/のターゲットmyproject-iosの製品名を$ {TARGET_NAME}からmyprojectに更新した後、@ testable import myproject_iosの名前を@testable import myprojectに変更することでした。
ビルド設定のテストターゲットで、ホストのテストを確認します。PRODUCT_NAMEで設定された名前が使用されます。テストクラスで使用する名前です。
PRODUCT_NAMEを変更しないことをお勧めします(メインターゲットの名前と一致)
Deployment Targetを9.3から11.0に変更すると、これは修正されました。
一般>展開ターゲット>「11.0」
Xcodebuildを使用していてこの問題が見つかった場合は、ビルドコマンドにワークスペースフラグを追加することを検討してください。
これを変更しました
$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test
これに
$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test