2012-01-16 9 views
4

XCodeを使用して単体テストを実行したいObjective-C [i-os]コードがあります。これは、使用して、デバイスの種類に応じて、異なるメタデータにアクセスします。UIUserInterfaceIdiom(ios)に依存するコードをテストする方法

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

私が持っている問題は、私はユニットテストを実行すると、この結果は常に真であるということです。理想的には、テスト実行時に設定できることは理想的です。

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

nice blog post with many links、Apple Unit testing guideおよびUnit test sample code projectを参照してください。

答えて

4

私は今朝のカップルの異なるアプローチを試してみました:

  1. だけ私のテスト対象にリンクされているカテゴリを使用しました。そのカテゴリでは、currentDevicepartialMockの実装(OCMock)で上書きし、必要なメソッドをスタブして、PadまたはPhoneを強制的に自分のテストに返すようにします。それは仕事を持っているはずですが、やUIApplicationのようなクラスを混乱させるのは非常に難しく、シミュレータはしばしばクラッシュして悪い兆候です。

  2. #undef UI_INTERFACE_IDIOM()および#defineそれは私のテストで.pchです。テストでの実装をUI_INTERFACE_IDIOM()が自分自身のシングルトンインスタンスに指し示しているので、それに応じてPadまたはPhoneに設定することができます。それはうまくいったが、主な問題は、テストを実行するとシミュレータもアップする(アプリケーションテスト)ので、あなたのテストをiPadで実行しているとテストは合格するが、シミュレータの他の部分は失敗するあなたが普遍的なアプリケーション環境にいる場合、それはUI_INTERFACE_IDIOM()から得られる対立応答のうちの1つです(ユニバーサルアプリ環境であれば、ペン先のiPhoneへのローディングがあります)

  3. これは最善のアプローチだと思います。コンピュータサイエンスのすべてとして、別のレイヤーを=に入れてください)コードの代わりにUI_INTERFACE_IDIOM()を使用してパッドや電話機にあるかどうかを評価し、このロジックをテスト中に疑似できるオブジェクトにカプセル化します。そうすれば、UI_INTERFACE_IDIOM()は残りのシミュレータでも利用できます。実動コードは実際にそれに依存しますが、テストで期待通りに応答できるスタブ付き実装に依存します。

この問題に関していくつかのコードを共有できます。そして、はい、これは疲れたものです!

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

+0

ようこそ、最初の答えがいいです! +1。自動化されたテストは私の職場では汚い言葉であり、ソース管理を最初に実行することにもっと関心があります。私はそれを最終的に進めたいと思っています。自動化されたテストは現時点でははるかに難しいようです。あなたが与えることができる追加の詳細は高く評価されます。ありがとう。 –

+0

何をしても、あきらめないでください!たぶんこれが助けになるでしょう:http://www.amazon.com/Test-Driven-iOS-Development-Developers-Library/dp/0321774183 –

+0

ありがとうございました!私は見てみましょう。 –

関連する問題