2015-10-21 17 views
13

iOS UIオートメーションのために今までKIF Frameworkを使っていました。 KIF(Unit Test)ターゲットは、アプリケーションが実行されているのと同じプロセスでUnit/UIテストコードを実行し、モックデータを表示するためにアプリケーションが使用するさまざまなオブジェクト/クラスを簡単にモックできます。 Xcode 7のUIオートメーションを使ったモックオブジェクト

Xcodeの7ベースの新しいUIオートメーションへの切り替え、私はUIユニットテストターゲットが別のプロセスで実行され、それが別のプロセスでアプリケーションを起動することがわかりました。したがって、単体テストを介してAppクラスやオブジェクトにアクセスしたり、それらをモックすることはできません。

は、誰もが同じ問題に直面して、任意の回避策を知ってましたか?

詳細が必要な場合は教えてください。

回答:以下の詳細な回答をご覧ください。また、ここでは、アップルの開発者から返信するためのリンクです:https://forums.developer.apple.com/thread/23552

答えて

10

にかなりうまく機能していますあなたのテストを通してあなたのアプリケーションにモックを注入する本当の方法です。あなたはあなたのアプリケーションのプロセスを制御することができますし、そのためにいくつかの影響を与えることができます。

私はこれについて気づいたことについて(私は現在未定ですが)、アプリに別のコードを追加して、アプリが異なる動作をする環境変数を(NSProcessInfo経由で)読み込むことができますあなたの依存性注入があなたのクラスに注入しているものを変更して、モックを使用する)。

モックコードは厳密にテストバンドルに含まれておらず、あなたはそのコードをアプリに入れます(それを分離するために#ifステートメントを使用しない限り)。明らかに、コード分岐を慎重にすることも重要なので、テストを無効にしないでください。

あなたは可能性があなたのUIテストでアプリを起動する前に、セットアップ環境変数:

let app = XCUIApplication() 
app.launchEnvironment = ["UITestUseMocks" : "true"] 
app.launch() 

次に、あなたのアプリケーションでは、あなたはおそらく#if文で、それをチェックし、あなたの行動を変えることができます。

#if TEST_TARGET 
    if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" { 
     // Alter services used in dependency injection or some other testing behavior 
    } 
#endif 

私は私のUIテストは、(他のものは、すべての後に、サーバーをテスト)サーバの応答に依存しないことができますので、ちょうどいくつかの缶詰サーバーの応答を再生モックサービス層を実装するために、このアプローチを検討してきました。

+1

ああ、うわー!これは、依存性注入のアイデア全体を破ります。私は間違いなく私の生産コードにテストコードを導入したくありません。これは本当にショーストッパーです。 – user1366265

+0

@ user1366265上記のコンパイラ指令のすべてをラップすると、プロダクションバイナリにそのようなコードを技術的に導入することはできません(コンパイラフラグが正しく設定されていることが前提です)。それを言っても、間違っているのは明らかに理想的ではなく簡単です。 –

-3

私はあなたが別のプロセスで実行されているので、そこにISN IOSにモックのために、そのライブラリを使用するとXcode 7 http://ocmock.org/ios/

+2

XCTestsでOCMockを使用することができても、すべてのXCUI操作がリモートプロセスとやり取りするため、XCTests + XCUIでは動作しないため、ランタイムクラスに対してローカルで行うモックXCUIコマンドの前には、2つのプロセスに異なる実行時インスタンスがあるため、リモートアプリケーションプロセスに影響はありません。 – bithavoc

+0

@bithavoc、それはまさに私が経験したことです。 – user1366265

関連する問題