web-dev-qa-db-ja.com

iOS-Swiftの単体テストの実行時に 'MyProject-Swift.h'ファイルが見つかりません

プロジェクトのユニットテストをセットアップしようとしています。これは既存のObjective-Cアプリです。最近、1つSwiftクラスに追加しました。「MyProject-Swift.h」とSwiftファイル(「MyProject」と「MyProjectTest」の両方)をブリッジすると、Objective-CとSwift=コードの両方を使用して、アプリをうまくビルドして実行できます。

ただし、新しいSwift=クラスで単体テストを実行します。テストファイルをセットアップすると、次のようになります。

MySwiftClassTests.Swift:

import UIKit
import XCTest
import MyProject

class MySwiftClassTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}

テストとしてアプリを実行すると、このエラーが発生します。

'MyProject-Swift.h' file not found

テストを実行しようとしたときにのみこれが起こる理由はわかりません。助言がありますか?

90
JimmyJammed

"MyProject-Swift.h"ファイルは次のパスに生成されます。

"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"

最終的に、これを単体テストターゲットのヘッダー検索パスに追加します。

また、@ hyouuuが既知の問題であることを指摘したように、うまくいけばAppleが最後に良い解決策を提供するでしょう。上記の解決策を使用する必要があると思うまで。

https://developer.Apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

143
gagarwal

これを理解してくれた@gagarwalに感謝します。この例では、製品名にスペースがあり、$PROJECT_NAME、だからハードコーディングしなければならなかった。さらに、$CONFIGURATION_TEMP_DIR の代わりに $TARGET_TEMP_DIR、親ディレクトリを削除できます(../)パスから。そのため、解決策は、テストターゲットのヘッダー検索パスに以下を追加することです。

"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"

または、製品にスペースが含まれていない場合:

"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"
30

Xcode 6.1のリリースノートで、これは既知の問題であることがわかりました... sign ...リリースノートで「-Swift.h」を検索 https://developer.Apple.com/library/content /documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

Objective-Cで記述されたテストは、アプリケーションターゲットのSwift生成されたインターフェイスヘッダー($(PRODUCT_MODULE_NAME)-Swift.h)をインポートできないため、このヘッダーを必要とするコードのテストには使用できません。

SwiftコードのテストはSwiftで作成する必要があります。フレームワークターゲット用にObjective-Cで記述されたテストは、@ import FrameworkName;を使用してフレームワークモジュールをインポートすることにより、Swift生成されたインターフェイスにアクセスできます。 (16931027)

下の@gagarwalの回避策をご覧ください!

14
hyouuu

あなたと同じような問題があったと思います。ここに私のセットアップがありました。

私はSwiftで定義されたオブジェクトを持っていました:

// file Foo.Swift
@objc public class Foo {
    // ...
}

このクラスは、Objective-Cオブジェクトの初期化子で使用されました。

// file Bar.h
#import "MyProject-Swift.h"

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

MyProject-Swift.hヘッダーが実在せず、単体テストのターゲットがそれを認識できないため、Barの単体テストがコンパイルされませんでした。 @hyouuuが共有するリリースノートは重要です-しかし、私はSwiftクラスをテストしていません。Objective-Cクラスをテストしています!

Barのヘッダーファイルを変更して、代わりに前方クラス参照を使用することで、これを修正できました。

// file Bar.h
@class Foo;

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

その後、MyProject-Swift.hBar.mに含めましたが、すべてが機能しました。Objective-Cで記述されたObjective-Cオブジェクトのテストは適切にコンパイルされ、実行を継続し、Swift Swiftのオブジェクト。

お役に立てれば!

7
dpassage

トピックで見つけることができるすべてを試した後、私のために働いたもの実際にはアプリを実行していますが、まだ「ModuleName-Swift.hファイルが見つかりません」と表示されていました)エラー。

それはなくなり、私のアプリは完璧に動作します。私は以前にそれを考慮すべきだったと思います... エラーが戻ってくる、しかし、アプリを実行した後、それは常に再び消えます。したがって、この問題は私にとっては本当に解決されませんが、今のところ他のトピックで作業を続けることができます...

4
schrulnz

シンプルな

@testable import MyProject

私のために仕事をしました。

0
niggeulimann

奇妙なことに、この同じエラーが表示されていましたが、デバイス(シミュレータではなく)をターゲットにしている場合にのみ発生しました。テストを実行する前に、「MyProjectNameTests-Swift.h」のインポート文の横に赤い感嘆符が表示されます。

しかし、面白いことに、先に進んでテストを実行すると(この明らかなビルドエラーにもかかわらず)、その後に発生するビルドフェーズ中に、XCodeは実際に「MyProjectNameTests-Swift.h」ファイルを生成し、うまく動作します!

ですから、少なくとも私の場合、明らかに他のソリューションは必要ありませんでした。

また、この前にDerivedDataディレクトリを削除したことにも注意する必要があります。したがって、これも試してみる価値のあるステップです。

0
CommaToast