web-dev-qa-db-ja.com

Xcode単体テストで@testableを使用する場合の「No such module」

Xcode 7ベータ5に最近更新しました。以前のプロジェクトに単体テストを追加しようとしましたが、@testable import myModuleName行に「No such module [myModuleName]」というエラーメッセージが表示されます。

enter image description here

私は試した

  • でプロジェクトを掃除する Option ビルドフォルダーのクリーンアップ
  • [テストオプションを有効にする](デバッグ)がビルドオプションで[はい]に設定されていることを確認する
  • テストターゲットを削除してから、iOSユニットテストバンドルを再度追加する

これはこのプロジェクトでは機能しませんでした(ただし、別のプロジェクトで動作するようにテストしました)。他の誰かがこの問題を抱えて解決しましたか?

123
Suragch

私のために働いた答え

答えは、ビルドに失敗していたプロジェクトにエラーがあったことです。 (これは、コードの毎日の標準バグでした。)エラーを修正し、別のクリーンアップとビルドを行った後、動作しました。

これらのエラーは最初は表示されなかったことに注意してください。それらを表示するには:

  • 「そのようなモジュールはありません」というエラーが表示されるテストファイル全体をコメント化します。
  • プロジェクトを再度実行してください。

他のエラーがある場合は、すぐに表示されます。それらを修正してから、テストファイルコードのコメントを外します。 「そのようなモジュールはありません」というエラーは、私にとってはなくなりました。


これで他の人の問題が解決しない場合は、次のことも試してください。

ビルドフォルダーのクリーンアップ

製品メニューを開き、押し続けます Option、[ビルドフォルダのクリーン...]をクリックします

enter image description here

Enable TestabilityがYesに設定されていることを確認してください

Project Navigatorでプロジェクト名をクリックします。 [ビルド設定]を選択し、[ビルドオプション]まで下にスクロールします。 Enable TestabilityがYes(デバッグ用)であることを確認してください。

enter image description here

テストターゲットを削除して再追加します

他のことを行った場合、おそらくこれを行う必要はないでしょう。しかし、もしそうなら、すでに書いたユニットテストを保存することを忘れないでください。

Project Navigatorでプロジェクト名をクリックします。次に、テストターゲットを選択します。下部のマイナス(-)ボタンをクリックして削除します。

enter image description here

次に、プラス(+)ボタンをクリックし、iOS Unit Testing Bundleを選択して再度追加します。ご覧のとおり、同じ方法でUIテストバンドルを追加することもできます。

他のいくつかのアイデア

  • 必要なすべてのクラスがテスト対象のメンバーであることを確認してください。
  • 必要なライブラリがすべて追加されていることを確認してください。
  • モジュール名が正しく記述されていることを確認してください( this answer を参照)。

または...

他に機能するものを見つけた場合は、下にコメントまたは回答を残してください。

関連

103
Suragch

@testable import "ModuleName"でインポートしようとするモジュール名を確認してください。モジュール名はTarget->Build Settings-> Product Module Nameで同じである必要があります

156
Voda Ion

私にとっての問題は、テストのiOS展開ターゲットがメインターゲットと同じに設定されていないことでした。これを必ず確認してください。

テスト対象:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
56
Jess

これが、以前の提案から提案されたすべての解決策を試した後、コードを機能させる方法です。

  • プロジェクトのビルド設定で「テスト可能性を有効にする」を「はい」に設定しました
  • また、プロジェクトのビルド設定で「モジュールの定義」を「はい」に設定しました。
  • MyAppと言う私のプロジェクト内の通常の.Swiftファイルの場合、both the main " MyApp "および"MyAppUnitTests "ターゲットは、Target Membershipでチェックされます。
  • 次に、ユニットテストファイルを選択し、 '@ testable import MyApp'を上部の 'import XCTest '、およびのみターゲットメンバーシップの下の「MyAppUnitTests」をチェックしました

そしてすべてが魅力のように働きました。お役に立てれば。

23
Vick Swift

注意すべき点は、モジュール名に-というダッシュ文字が含まれている場合は、_ではなくアンダーバーを使用して参照する必要があるということです。何らかの理由で、これが問題になるのではないかと疑いました。

例えば。 @testable import Ocean-Swift@testable import Ocean_Swiftになります

もう1つだけ、@testable構文を使用する場合は、テスト対象に実動コードを含めないでください。これは不可解な奇妙さを引き起こすことがわかった。

16
smileBot

これは、両方のターゲットのビルド設定に関するエラーのようです。以下を確認する必要があります。

  • ENABLE_TESTABILITYは両方のターゲットでYesに等しくなります。
  • テスト対象のPRODUCT_MODULE_NAME値は、アプリケーションのものとは異なる必要があります。
10
yageek

確認すべきもう1つのこと:Objective-Cプロジェクトがあり、Swiftで単体テストを作成している場合、メインターゲットが少なくとも1つのSwiftファイルを使用していることを確認してください!


詳細:

私はObjective-Cプロジェクトに取り組んでいましたが、Swiftでユニットテストを書きたいと思っていました。

Swiftファイルをメインターゲットに追加して、必要なProjectName-Bridging-Header.hファイルを生成し、テストを作成したところ、すべてが正常に機能していました。

後で不要だと思ったため、Swiftファイルを削除しました(メインターゲットのコードはすべてObjective-Cにあります...私はSwiftでテストを書いているだけです)。

「クリーン/クリーンビルドフォルダー」を実行し、「そのようなモジュールはありません」という問題が表示された後、問題が発生するまで気付きませんでした。頭をひっかいてから、新しい空のSwiftファイルを追加すると、問題はなくなりました。

私はSwiftファイルの有無にかかわらず何度もテストしましたが、それだけで動作します...そのため、プロジェクトに空白ファイルを残すか、Objective-CをSwiftに変換するか、いくつかを追加する必要がありますSwiftで書かれたプロジェクトの新しいコード。

9
Jim Rhoades

テストスキームのビルド設定の下で、テストターゲットがリストにあることを確認してください。

再生ボタンの横で、テストスキームを選択し、次にスキームを編集...を選択し、ビルドセクションに移動し、プラス+をクリックして、テストするターゲットを選択します。

私の場合、内部ターゲットがあります(いくつかの小さな違いがあります)。マージ後、テスト構成から削除されました。

Edit test scheme

5
BrianHenryIE

私の解決策はここにあります。

まず、OdeAlSwiftUITest.Swiftをクリックしてから、ターゲットメンバーシップのProject TargetNameを確認します。

enter image description here

5
eyupcimen

ここにリストされていないもう1つの確認事項があります。私にとっては、チームのエージェントが最新のライセンス契約にまだ同意していないためか、チームと関係がありました!ターゲットの一般設定で別のチームを選択し、12.1または11.0などの特定の展開ターゲットを指定すると、突然「そのようなモジュールはありません」という警告が消えました。

enter image description here

enter image description here

4
Dave Levy

上記の手順に従いましたが、うまくいきました。しかし、私のプロジェクトにはさらにいくつかの問題がありました。この警告が表示され、メインプロジェクトのクラスにアクセスしてテストターゲットでテストすることができませんでした。

Tests part of module - ignoring import

テスト対象の製品モジュール名(YourTestTarget->ビルド設定-> product moduleの検索)をプロジェクト名と同じ名前にすることはできません。

Product Module Name for test target cannot be the same name as your project name

テスト対象の製品モジュール名を変更すると、すべてが機能しました。

enter image description here

2
Bryan Norden

これと同じ問題がありました。ビルドフォルダーのクリーニングとXcodeの再起動は機能しませんでした。

私にとってうまくいったのは、テストターゲットとスキームの「アクティブアーキテクチャのみをビルド」の設定が、アプリのターゲットとスキームの設定と一致するようにすることでした。

2
palmi

環境:Xcodeバージョン9.0(9A235)
シナリオ:オープンソースフレームワークのテスト。

私は同じ問題を抱えていました:「そのようなモジュールはありません」。

解決策:

  1. テスト対象を選択します。
  2. ビルドフェーズの選択
  3. リンクバイナリ経由でテストするフレームワークを追加...

enter image description here

テストファイルは次のとおりです。 enter image description here

2

私の問題は、テストしたいクラスが別のモジュール(APIクライアント)にあるはずでしたが、クラスは実際にはフレームワークターゲットではなくアプリターゲットのメンバーであるということでした。クラスのターゲットメンバーシップを変更すると、インポートエラーがなくなりました。

2
Maciej Swic

この問題に数日を費やした後、ようやくプロジェクトで動作するようにしました。問題はブリッジングヘッダーにありました-メインターゲットでブリッジングヘッダーを使用している場合、テストターゲットのパスを空にすることはできません Bridging Header can't be empty!!!

誰かの時間を節約できることを願っています。

2
Igor P

私の解決策は、ビルド設定/パッケージ/製品名/のターゲットmyproject-iosの製品名を$ {TARGET_NAME}からmyprojectに更新した後、@ testable import myproject_iosの名前を@testable import myprojectに変更することでした。

0
Matthias

ビルド設定のテストターゲットで、ホストのテストを確認します。PRODUCT_NAMEで設定された名前が使用されます。テストクラスで使用する名前です。

PRODUCT_NAMEを変更しないことをお勧めします(メインターゲットの名前と一致)

0
Sam

Deployment Targetを9.3から11.0に変更すると、これは修正されました。

一般>展開ターゲット>「11.0」

0
user9226093

enter image description here

プロジェクトナビゲータでMyAppTests.Swiftをクリックし、右側のパネルをクリックして、ターゲットメンバーシップのモジュールを確認します。それは私の中で機能します。

0
Firda Sahidi

リストした他のものに加えて、ユニットテストモジュール用のコンパイルソースにテストしようとしたクラスのファイルを追加する必要がありました enter image description here

0
Matt D

Xcodebuildを使用していてこの問題が見つかった場合は、ビルドコマンドにワークスペースフラグを追加することを検討してください。

これを変更しました

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

これに

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test