5

XCodeを使用して単体テストを実行したいObjective-C[i-os]コードがいくつかあります。デバイスのタイプに応じて、以下を使用してさまざまなメタデータにアクセスします。

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

私が抱えている問題は、単体テストを実行すると、この結果が常に真になることです。理想的には、テストの実行時に設定できると便利です。

私がそれを行うことができると思う方法は、デバイスチェックをカプセル化するクラスを作成し、それをテスト用にモックすることです。しかし、もっと良い解決策があるかどうかは一見の価値があると思いました。

参考までに、多くのリンクがある素敵なブログ投稿、Appleユニットテストガイドユニットテストサンプルコードプロジェクト

4

1 に答える 1

5

今朝、いくつかの異なるアプローチを試しました。

  1. UIDeviceテスト ターゲットにのみリンクされているカテゴリを使用します。そのカテゴリでは、実装 ( ) でオーバーライドcurrentDeviceし、必要なメソッドをスタブして、特定のテストに強制的に Pad または Phone を返すようにします。動作するはずですが、やなどのクラスを台無しにするのは非常に困難です。シミュレーターはしばしばクラッシュします。これは悪い兆候です。partialMockOCMockUIDeviceUIApplication

  2. #undef UI_INTERFACE_IDIOM()そして#defineそれは私のテストで.pch。テストの実装を独自のシングルトンUI_INTERFACE_IDIOM()インスタンスにポイントし、それに応じて Pad または Phone に設定できます。それは機能しましたが、主な問題は、テストを実行するとシミュレーターも起動することです (アプリケーション テスト)。そのため、iPad でテストを実行している場合、テストは成功しますが、シミュレーターの他の部分は失敗します。それが得る矛盾した応答のUI_INTERFACE_IDIOM()1つ(そのようなものの1つは、ユニバーサルアプリ環境にいる場合のiPhone固有のペン先のロードです)

  3. これが最善のアプローチだと思います。コンピューター サイエンスのすべてと同様に、=) に別のレイヤーを配置するだけです。パッドまたは電話デバイス上にあるかどうかを評価するためにコードを使用する代わりにUI_INTERFACE_IDIOM()、テスト中にモックできるオブジェクトにこのロジックをカプセル化します。その方法UI_INTERFACE_IDIOM()は、シミュレーターの残りの部分で引き続き使用できます。実稼働コードは実際にこれに依存しますが、テストは、テストで期待どおりに応答できるスタブ化された実装に依存します。

もしよろしければ、この件に関するいくつかのコードを共有できます。そして、はい、これは疲れたものです!

これをどのように回避できましたか?

于 2012-07-01T17:01:51.317 に答える