46

swift testテストケースを実行するためにコマンドラインから実行しています。これはテストケースです:

import XCTest
@testable import vnk_swift

class KeyMappingTests: XCTestCase {
    static var allTests : [(String, (KeyMappingTests) -> () throws -> Void)] {
        return [
            // ("testExample", testExample),
        ]
    }

    func testExample() {
        let keyMapping = KeyMapping()
        XCTAssertNotNil(keyMapping , "PASS")
    }
}

そして、ここに出力メッセージがあります。

画像

の使用を削除するとKeyMapping、すべて正常に動作します。

    func testExample() {
        // let keyMapping = KeyMapping()
        XCTAssertNotNil(true , "PASS")
    }

画像

クラスを使用しようとしているときに問題があるようです。これを修正するにはどうすればよいですか?

(私はこのプロジェクトで Xcode を使用しませんでした。このプロジェクトswift package initのソース コードはここにあります: https://github.com/trungdq88/vnk-swift )

4

8 に答える 8

54

次の変更を行うことで、パッケージを正常にビルドしてテストすることができました。

  • パッケージ名の名前をVnkSwiftに変更しました。何らかの理由で、ビルド ツールはパッケージ名のダッシュを好まず、また、生成されたパッケージ名にアンダースコアがある場合にも機能しません (そのため、パッケージの名前を に変更しvnk_swiftて、インポート ステートメントとパッケージ名が一致することを確認します)。うまくいきませんでした)
  • VnkSwiftTestsリンカーがリンク先を認識できるように、テスト フォルダーの名前を に変更しました。これは、リンカーがパッケージに対してリンクすることを知るための前提条件のようです
  • 最後に、別の名前に変更main.swiftしました(私は を使用しutils.swiftました)。問題は、 の存在がmain.swiftビルド ツールに実行可能ファイルを生成するように指示し、実行可能ファイルに対するリンクがうまく機能しないことです。ifグローバル実行コードは にのみ属することができるため、名前変更後、コードをコメントする必要がありましたmain.swift

結論として:

  • 英数字以外のパッケージ名を避ける
  • パッケージ名とテスト ディレクトリ名は同期している必要があります
  • main.swiftパッケージをリンクできることを確認するためのファイルがないことを確認してください

実行可能ファイルに対してターゲット リンクを単体テストできないのはなぜですか?

これは、テスト バンドルと実行可能バンドルの両方にグローバルな実行コード (メイン関数とも呼ばれます) があるため、リンカーはどちらを選択すればよいかわかりません。Xcode からテストする場合、テスト バンドルはアプリケーションのコンテキストで実行されます。この状況のように、アプリケーションに対してリンクしません。

Xcode では、コマンド ライン ツールを作成するときにもこの問題が発生します。そのターゲットを単体テストすることはできません。コードを単体テストする場合は、ツールと単体テスト ターゲットの両方によってリンクされるライブラリを作成する必要があります (または両方のターゲットにファイルを含めます)

于 2017-01-01T10:36:41.417 に答える