私は最近アプリを変換し、ユニットテストをSwift 2.0に変換しています。Tests.Swiftファイルで@testable import AppName
を使用しています。
複数のターゲットでサブクラスを実行できない問題( 問題についてはこちらを参照 )のため、私のクラスEntityName
はターゲットメンバーシップAppName
のみにすることができます。およびAppNameTests
ではありません。
問題は、ユニットテストを実行するためにAppNameTests
スキーマに切り替えると、モジュールAppName
のコードがクラスEntityName
を見つけられず、
宣言されていない型 'EntityName'の使用
スキーマのメンバーではないエンティティクラスなしでAppName
スキーマからテストを実行するときに、AppNameTests
をコンパイルするにはどうすればよいですか?
複数のターゲットでサブクラスを実行できないという問題のため
異なるターゲットの一部として同じSwiftコードをコンパイルすると、コンパイラは実際に異なるクラスを生成します。したがって、これは次のように動作します。設計されていますが、ほとんどの場合、アプリの単体テストを実行するときに必要なものではありません。
テストを許可するようにモデルを設定することをお勧めする方法は2つあります。
アプリのターゲットで:
import RealmSwift
public class MyModel: Object {}
このコードはonlyをアプリケーションターゲットの一部としてコンパイルする必要があり、ユニットテストは次の方法で設定できます。
import MyApp
// should be able to access `MyModel`
簡単ですか?
このアプローチは@testable
キーワードがSwift 2.で導入されました。
アプリのターゲットで:
import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`
繰り返しますが、このコードはアプリケーションターゲットの一部としてonlyをコンパイルする必要があり、ユニットテストは次の方法で設定できます。
@testable import MyApp
// should be able to access `MyModel`
MyAppのビルド設定にEnable Testability
をYES
に設定します。
フレームワークのユーザーが内部モデルにアクセスできないようにするフレームワークを構築している場合、このアプローチはパブリックモデルよりも優先される場合があります。
Realmには、テストへのこれらの一般的なアプローチを詳しく説明するドキュメントの専用セクションがあり、ここで読むことができます。 https://realm.io/docs/Swift/latest/#avoid-linking-realm-and-tested-code -in-test-targets
MyAppTestsのメンバーになるには、アプリ全体の.Swiftファイルを対象とせず、@testable import MyApp
のみに依存する必要がありました
まず、@testable import MyApp
はすべてのテストファイルに含まれています。次に、テストターゲットのビルドフェーズで、バンドルファイルのコピーセクションのテスト以外のすべてのファイルを削除します。テストターゲットに含まれていないアプリファイルが、テストターゲットに含まれていないアプリファイルをポイントしていると、ユニットテストが失敗します。テストターゲットからすべてのアプリファイルを削除し、@testable
フラグとすべてが機能するはずです!
同様の問題があり、問題はすべてのアプリケーションソースファイルが単体テストターゲットにリンクされているため、2回コンパイルされたことです。
また、Carthageを介してRealmをインストールし、それ以外の方法では機能しないため、フレームワーク「Realm.framework」と「RealmSwift.framework」の両方のターゲット(メインとテスト)を含める必要がありました。
ここに問題のリンクがあります