プロジェクトにいくつかの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アーキテクチャi386clang:エラー:リンカーコマンドが終了コード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の人は、設定にテストホストとバンドルローダーを追加することで回避策を試みましたが、これは正しいアプローチではないと思います。 @testable
はすべてが機能するはずであり、現時点ではそのようには見えないと思います。助けていただければ幸いです。
@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
がなくても)すぐに機能します。
ファイルインスペクター-> ターゲットメンバーシップ->チェックIテストターゲット(メインターゲットに加えて)
希望Appleはすぐに修正され、よりクリーンな使用方法が得られるようになります。
UIテストはアプリとは別のモジュールであるため、ロジックテストのようにアプリ内で実行することはできません。彼らがコードを共有する唯一の方法は、2つのモジュール間で共有する必要のあるすべてのアプリファイルをコンパイルすることです。これを実現する方法については、このブログを確認してください https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/
ここに提出されたレーダーも見つかりました https://openradar.appspot.com/23116258
@testable import <yourApp>
実際にこのバグを引き起こしている可能性があります。ただ線を引いてください。 UIテストには必要ありません。
「UIテストはアプリの外部で別のプロセスで実行されます。UIテストの内部からアプリコードにアクセスすることはできません。これは意図的に設計の一部です。アプリコードにアクセスする必要があるテストには単体テストを使用し、ユーザーを自動化するにはUIテストを使用します。相互作用テスト」
6分後、@ testableはApple Developers。 https://www.youtube.com/watch?v=7zMGf-0OnoU&t=1316s ==