Xcodeユニットテストで@testableを使用すると、「そのようなモジュールはありません」


168

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

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

私は試した

  • OptionClean Build Folderでプロジェクトをクリーンアップする
  • ビルドオプションで[Enable Testability](デバッグ)が[Yes]に設定されていることを確認する
  • テストターゲットを削除してからiOSユニットテストバンドルを再度追加する

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



xcodebuildを使用してコマンドラインからビルドする場合は、ビルドコマンドに-workspaceフラグを必ず追加してください。私はこの方法でトラビスを構築してこの問題を解決しました。
Victor 'Chris' Cabral

回答:


210

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


5
ほとんどの場合、それは製品モジュール名に関するものです。チェックspaceして_
onmyway133

5
と注意し-てください_。私のプロジェクトの1つには-名前のマイナスがありますが、モジュールには_代わりに下線が付いています
ベリリウム

4
私は""アイデアを使って、そして得たExpected identifier in import declaration
18:18の

1
@ onmyway133は非常に近かった。私の場合、プロジェクト名とは異なる製品モジュール名がありました。モジュール名を見つけるには、Build Settingsプロジェクト(テストまたはUIテストではない)を選択し、次にPRODUCT_MODULE_NAME何が表示されるかを検索します@testable import
jonmecer

115

私のために働いた答え

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

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

  • 「No such module」エラーが発生しているテストファイル全体をコメント化します。
  • プロジェクトをもう一度実行してみてください。

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


これで他の人の問題が解決しない場合は、以下を試すこともできます。

ビルドフォルダーをクリーンアップする

[製品]メニューを開き、を押しOptionながら[ビルドフォルダーのクリーンアップ...]をクリックします。

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

[テスト可能性を有効にする]が[はい]に設定されていることを確認します

プロジェクトナビゲーターでプロジェクト名をクリックします。[ビルド設定]を選択し、下にスクロールして[ビルドオプション]を表示します。[テスト可能性を有効にする]が[はい](デバッグ用)であることを確認します。

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

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

もしあなたが他のことをしたなら、私の推測ではおそらくこれを行う必要はないと思います。ただし、その場合は、既に作成したユニットテストを必ず保存してください。

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

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

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

他のいくつかのアイデア

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

または...

うまくいった何か他のものを見つけたら下にコメントを残すか答えてください。

関連する


2
Xcode 7ベータ5では、すべて同じ問題が発生します。残念ながら、上記の手順では問題が解決しないようです。モジュールはまだ「そのようなモジュール「ユーティリティ」がない」と見なしています。スクリーンショットとの唯一の違いは、UIテストフォルダー(私の場合はGlimpulseUITests)でこれを機能させようとしていることです。@testableはUIテストターゲットでは機能しませんか?
Zac

5
***重要***テストターゲットを削除して再度追加すると、既存のテストを上書きする空のテストテンプレートが再作成されます。これを行う前に、必ずテストソースを保存してください。
15年

2
私にとって、入力中に個々のクラスも表示されていませんでした...私は最終的にProduct> Cleanを実行し、XCodeを再起動しました。それが再起動したときに、インデックス作成が完了するまで数秒待ってから、各クラスをテストターゲットのメンバーとして含める必要なく、すべての参照が表示されました。
Rajive Jain

1
また、これを試したことがない場合は、左側の不足しているフレームワークをクリックし、右側で「ターゲットメンバーシップ」を選択して、単体テストターゲットに含めます。
albogdano 2016

3
メインターゲットのビルド設定->「製品モジュール名」に移動し、テストでインポートしようとしているモジュール名と一致するかどうかを確認します。
f0rz

64

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

テストターゲット:

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

それを行った後、私はテストバンドルに設定Enable Bitcodeする必要がありNoました。
pableiros 2017年

2
Lolは動作しますが、xcodeからどれほど愚かであっても別のエラーをスローしません
J. Doe

31

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

  • プロジェクトのビルド設定で「テスト可能性を有効にする」を「はい」に設定しました
  • また、プロジェクトのビルド設定で「モジュールの定義」を「はい」に設定しました。
  • プロジェクト内の通常の.swiftファイル(たとえばMyApp)の場合、テストケースを作成するつもりですが、メインの「MyApp」と「MyAppUnitTests」の両方ターゲットが[ターゲットメンバーシップ]でチェックされています
  • 次に、単体テストファイルを選択し、 ' @testable import MyApp 'を上部の ' import XCTest 'の下で宣言し、ターゲットメンバーシップの下の "MyAppUnitTests" のみをチェックしました

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


8
テスト可能性を有効にし、モジュールを定義するのがコツです。通常の* .swiftファイルのターゲットメンバーシップを変更する必要はありませんでした。
ジョージヤコブ

上記の手順をすべて実行しましたが、まだそのようなモジュールエラーはありません。私のプロジェクトは迅速なobj cミックスです
Mikael

@ Mikael、Objc / Swift混合コードベースのSwiftファイルのみのテストを作成していますか?(前回チェックしたときに、 '@ testable import'は、Obj-c / Swiftコードベースの混合物でも、Swiftファイルのみのテストケースを作成するためにしか機能しなかったので、質問します。おそらく、今までに変更された可能性があります。誰かが私を修正した私がここで間違っている場合)。
Vick Swift

6
問題が見つかりました。これは、テストターゲットの有効なアーキテクチャが、メインターゲットの有効なアーキテクチャ構成と同じではなかったためです。今では動作します。ところで、私は私の場合、Swiftクラスのみをテストしています。Obj-cを試してみませんでした
Mikael

3
アプリケーションのswiftファイルをテストターゲットに追加しないでください。テストを実行すると、コンテンツが複製されます。
はPrzemyslawWrzesiński

18

注意が必要なのは、モジュール名にダッシュ文字が含まれている-場合は、代わりにアンダーバーで参照する必要があるということ_です。何らかの理由で、これが問題であるのではないかと思ったのですが、それは本当に私の問題でした。

例えば。@testable import Ocean-Swiftなる@testable import Ocean_Swift

もう1つ、@testable構文を使用する場合は、テストターゲットに製品コードを含めないでください。これは不可解な奇妙さを引き起こすことがわかりました。


1
英数字以外の文字もすべてアンダースコアに置き換える必要があります。私のターゲットはこのフォーマットでした、App (Dev)テスト可能なモジュールは次のようになりましたApp__Dev_
mushcraft

11

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

  • ENABLE_TESTABILITY 両方のターゲットで「はい」に等しい。
  • PRODUCT_MODULE_NAMEテストターゲットの値は、アプリケーションの値とは異なる必要があります。

2
これでうまくいきました。間違ったモジュール名を使用していました。_を追加する代わりにスペースを削除していました。ビルド設定で製品モジュール名をダブルチェック
MoralCode

9

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


より詳しい情報:

私はObjective-Cプロジェクトに取り組んでいましたが、Swiftで単体テストを書きたかったのです。

必要なProjectName-Bridging-Header.hファイルを生成するためにSwiftファイルをメインターゲットに追加し、テストを書き込んだところ、すべてが適切に機能していました。

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

「クリーン/クリーンビルドフォルダー」を実行し、「そのようなモジュールがありません」の問題が現れた後まで、問題に気づきませんでした。頭をひっかいた後、新しい空のSwiftファイルを追加し、問題は解消しました。

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


1
!! 3時間後、Drievedデータの削除、クリーニング、クリーニングを最初から3回実行して、私の問題を解決するコメントを見つけました!!! ありがとう!!!!
Maryam Fekri 2017年

SwiftテストクラスのObjective-Cクラスにアクセスする方法を知っていますか。プロジェクトモジュールをインポートしたのでエラーは発生しませんが、それでもObjective-Cクラスを認識できません。他に何かすべきですか?
Maryam Fekri 2017年

追加したいポイントが1つありますが、ほとんどのObjCプロジェクトには少なくとも1つのSwiftファイルがあり、ターゲットのブリッジヘッダーがありませんでした。次のリンクの「アプリターゲット内のコードのインポート」の説明に従って、SwiftテストからObjCクラスにアクセスできるようになりました。 developer.apple.com/documentation/swift/...
ミナミ

この問題に遭遇しました。ただし、可能であればSwiftファイルを含めないようにする方法を見つけることに興味があるので、ここで質問しました:stackoverflow.com/q/62965954/211292
ThomasW

実際、この@testable import Foo行を含めなければ、ユニットテストは正しく実行されるはずです。
ThomasW

9

最後の回答までスクロールしても問題が解決しない場合は、他のすべての回答のアドバイスに従って行った結果を以下に示します。Xcode 11を使用しています:

私の場合の問題の原因は、製品名を変更したことです

  1. 私は私の変更製品名をに私のメインターゲットのビルド設定で「新しい名前」
  2. テストターゲットのホストアプリケーションを再選択する必要がありました
  3. 製品名を変更すると製品モジュール名も変更されることを知りませんでした。これは、テストファイルでモジュールのインポートに使用される名前です。インポートを次のように変更しました。

    @testable import New_Name

  4. 出来た

それが役に立てば幸い


7

この問題に2、3日費やした後、ようやくプロジェクトで使用できるようになりました。ブリッジヘッダーに問題がありました-メインターゲットでブリッジヘッダーを使用している場合、テストターゲットのパスを空にすることはできませんブリッジヘッダーは空にできません!!!

それが誰かのために時間を節約することを願っています。


5

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

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

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

テストスキームを編集


5

リストされていないことを確認するもう1つのことを次に示します。私にとって、それは私のチームと関係がありました。おそらく、私たちのチームのエージェントがまだ最新のライセンス契約に同意していないためでしょう!ターゲットの[全般]設定で別のチームを選択し、12.1や11.0などの特定のデプロイメントターゲットを指定すると、突然「そのようなモジュールはありません」という警告が表示されなくなりました。

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

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


4

私の場合、3つの問題がありました。1つ目は、インポートパスを指定する必要があったことです。

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

2つ目は、ポッドを使用していて、これらのポッドをテストにインポートする必要があることです。

target 'MyAppTests' do
    inherit! :complete
end

3つ目は、ターゲットでブリッジヘッダーを使用していたため、テストで同じになるようにブリッジヘッダーを指定する必要がありました。


2

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


2

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

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

解決:

  1. テストターゲットを選択します。
  2. ビルドフェーズを選択
  3. リンクバイナリを介してテストするフレームワークを追加...

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

テストファイルは次のとおりです。 ここに画像の説明を入力してください


2

私も同じ問題を抱えていました。ビルドフォルダーのクリーニングとXcodeの再起動は機能しませんでした。

私にとってうまくいったことは、テストのターゲットとスキームの「Build Active Architecture Only」の設定がアプリのターゲットとスキームの設定と一致することを確認することでした。


2

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

モジュールの一部をテストします-インポートを無視します

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

テストターゲットの製品モジュール名は、プロジェクト名と同じ名前にすることはできません

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

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


1

私の解決策はこちらです。

最初にOdeAlSwiftUITest.swiftをクリックし、ターゲットメンバーシップのProject TargetNameを確認します。

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


7
これは間違っています。テストファイルをターゲットに追加しないでください。
smileBot

1

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

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


1

ここですべての答えを試しましたが、赤旗は消えません。しかし、空のテストを「実行」するだけで機能し、クリアされました。

私が確認したいことは完了しています:

  • ホストアプリケーション
  • @testable import "Module_name"(モジュール名が正しいことを確認してください)
  • テストの展開ターゲットがプロジェクトと同じであることを確認してください
  • XCTestはターゲットメンバーシップを持っている必要はありません

0

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


0

これは、デプロイメントターゲットを9.3から11.0 に変更したときに修正されました。

General> Deployment Target> "11.0"


これは、シミュレーターを変更する場合に当てはまるかもしれませんが、私にとってもうまく
いきました

0

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

これを変更しました

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

これに

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

0

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

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



-1

この回答で説明したように私はSwiftテストをObj-Cのみのプロジェクトに追加していました。解決策は、ダミーのSwiftクラスを追加することでした。その後、Xcodeはブリッジヘッダーを追加するように要求し、その後Swiftクラスを削除します。その後はすべて元気でした。


-1

リストされている他のものに加えて、ユニットテストモジュールのコンパイルソースに、テストしようとしたクラスを含むファイルを追加する必要がありました。ここに画像の説明を入力してください


-1

サンプルテストを削除したため、これが発生した可能性があります。

ユニットテストバンドルを削除してから、次の図に示すように再度追加しましたが、すべて順調でした。

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

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

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