34

プロジェクトにいくつかの UI テストを実装しようとしています。テスト ケースを記録し、いくつかのアサートを追加してから、テストを実行します。これは問題なく動作しますが、テスト内からアプリケーション モジュールにアクセスしようとすると、リンカーがエラーをスローします (以下を参照)。

アプリケーション ソース ファイル内:

func foo() {
   assert(true)
}

UI テストでは:

import XCTest
@testable import MyApp

func testExample() {
    foo()
}

エラー:

アーキテクチャ i386 の未定義シンボル: "MyApp.foo () -> ()"、参照先: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() -> () in MyAppUITests.o ld: symbol(s) not found forアーキテクチャ i386 clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを表示するには -v を使用します)

アーキテクチャ x86_64 の未定義のシンボル: "MyApp.foo () -> ()"、参照先: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() -> () in MyAppUITests.o ld: symbol(s) not found forアーキテクチャ x86_64

ここで同様の問題が報告されています: https://forums.developer.apple.com/thread/20609 しかし、解決策はありません。@testable単に正しく機能しないように思えます。developer.apple.comの担当者は、設定に Test Host と Bundle Loader を追加することで回避しようとしましたが、これは正しいアプローチではないと思います。はすべてを機能させるべきだと思いますが@testable、現時点ではそうではありません。どんな助けでも大歓迎です!

4

3 に答える 3

60

@testable import MainModuleコード補完を有効にしますが、UI テストでは機能しません (機能していると感じるかもしれません)。これまでのところ、単体テスト用にのみ設計されています。そして、次のようなビルドの失敗につながります。

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

回避策は、ソース コード ファイルを UI テスト ターゲットにも追加すること@testable importです。

ファイル インスペクター->ターゲット メンバーシップ-> UI テスト ターゲットをチェック(メイン ターゲットに加えて)

Appleがすぐに修正して、よりクリーンな方法で使用できるようになることを願っています.

于 2016-04-13T19:30:25.093 に答える
6

UI テストはアプリとは別のモジュールであるため、ロジック テストのようにアプリ内で実行することはできません。コードを共有する唯一の方法は、2 つのモジュール間で共有する必要があるすべてのアプリ ファイルをコンパイルすることです。それを達成する方法については、このブログをチェックしてください。

https://openradar.appspot.com/23116258にもレーダーが記録されています。

于 2015-11-30T10:06:30.567 に答える