web-dev-qa-db-ja.com

ユニットテストSwift 2.0、@ testable import、およびスキームターゲティングの問題

私は最近アプリを変換し、ユニットテストをSwift 2.0に変換しています。Tests.Swiftファイルで@testable import AppNameを使用しています。

複数のターゲットでサブクラスを実行できない問題( 問題についてはこちらを参照 )のため、私のクラスEntityNameはターゲットメンバーシップAppNameのみにすることができます。およびAppNameTestsではありません。

問題は、ユニットテストを実行するためにAppNameTestsスキーマに切り替えると、モジュールAppNameのコードがクラスEntityNameを見つけられず、

宣言されていない型 'EntityName'の使用

スキーマのメンバーではないエンティティクラスなしでAppNameスキーマからテストを実行するときに、AppNameTestsをコンパイルするにはどうすればよいですか?

18
styler1972

複数のターゲットでサブクラスを実行できないという問題のため

異なるターゲットの一部として同じSwiftコードをコンパイルすると、コンパイラは実際に異なるクラスを生成します。したがって、これは次のように動作します。設計されていますが、ほとんどの場合、アプリの単体テストを実行するときに必要なものではありません。

テストを許可するようにモデルを設定することをお勧めする方法は2つあります。

1.公開モデル(推奨)

アプリのターゲットで:

import RealmSwift
public class MyModel: Object {}

このコードはonlyをアプリケーションターゲットの一部としてコンパイルする必要があり、ユニットテストは次の方法で設定できます。

import MyApp
// should be able to access `MyModel`

簡単ですか?

2. @Testable(Swift 2のみ)

このアプローチは@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 TestabilityYESに設定します。

フレームワークのユーザーが内部モデルにアクセスできないようにするフレームワークを構築している場合、このアプローチはパブリックモデルよりも優先される場合があります。

Realmには、テストへのこれらの一般的なアプローチを詳しく説明するドキュメントの専用セクションがあり、ここで読むことができます。 https://realm.io/docs/Swift/latest/#avoid-linking-realm-and-tested-code -in-test-targets

20
jpsim

MyAppTestsのメンバーになるには、アプリ全体の.Swiftファイルを対象とせず、@testable import MyAppのみに依存する必要がありました

10
styler1972

まず、@testable import MyAppはすべてのテストファイルに含まれています。次に、テストターゲットのビルドフェーズで、バンドルファイルのコピーセクションのテスト以外のすべてのファイルを削除します。テストターゲットに含まれていないアプリファイルが、テストターゲットに含まれていないアプリファイルをポイントしていると、ユニットテストが失敗します。テストターゲットからすべてのアプリファイルを削除し、@testableフラグとすべてが機能するはずです!

0
Ben Fox

同様の問題があり、問題はすべてのアプリケーションソースファイルが単体テストターゲットにリンクされているため、2回コンパイルされたことです。

また、Carthageを介してRealmをインストールし、それ以外の方法では機能しないため、フレームワーク「Realm.framework」と「RealmSwift.framework」の両方のターゲット(メインとテスト)を含める必要がありました。

ここに問題のリンクがあります

https://github.com/realm/realm-cocoa/issues/3627

0
Pavle Mijatovic

私も最近このエラーが発生し、上記の手順のいずれも問題を修正しませんでした。修正されたのは、Swift以外のファイルをコンパイルソースビルドフェーズから削除することでしたテストを実行するターゲットで。これは静かに失敗しました

enter image description here

0
amleszk