2013-07-19 11 views
5

かなり複雑ですが、MVCを使用するアプリケーションを遡って単体テストしようとしています。私は単体テストを適用して回顧的には理想的ではないことを知っていますが、私はまだそれが既存のコードをリファクタリングすることによって可能と信じています。大部分の時間は、他のユニットに頼らずにユニットをテストすることができません。つまり、ビューはモデルに依存しています。ユニットテストが他のユニットに依存している場合、モジュールテストはどのようにモジュール化できますか?

この場合、単体テストにはどのような方法が最適ですか?実際のモデルを利用したり、モックモデルを作成する方が良いでしょうか?

私の状況で実際のモデルを使用する際の問題は、モデルがXMLからデータを取得する他の応答クラスに依存しているため、依存関係があることです。このモデルには多くのデータが含まれているため、これを使用する方がはるかに簡単ですが、その点を見逃している可能性があります。

私は簡潔にするためにアプリケーションのUMLを提供しました。

enter image description here

**編集****

[OK]を、私は正しいだので、もし、モッククラス内のモックデータを作成するためのベストプラクティスですか?例えば私はエラーなしで実行するために、「PlaylistPanel」Viewクラスに必要なデータを作成し、モッククラス「MockPlaylistPanelModel」を持っている:

class MockPlaylistPanelModel extends Mock implements IPlaylistPanelModel 
{ 
    /** 
    * Return all playlist items 
    * @public 
    */ 
    public function get mainPlaylistItems():Vector.<PlaylistData> 
    { 
    var playData:Vector.<PlaylistData> = new Vector.<PlaylistData>; 
    var playlistResp:PlaylistData = new PlaylistData(0, "", "", 0, 0, 0, 0); 
    playData.push(playlistResp); 
    return playData; 
    } 

} 

答えて

6

既存のアプリケーションへの遡及的にフィットユニットテストするには、多くの場合、(あなたは間違いなくあなたには、いくつかのリファクタリングを実行する必要があるかもしれません言及として)ユニットテストをサポートするために、アプリケーション・コードを変更する必要があります。ただし、ここでのリスクは、アプリケーションの変更によってバグが発生することです。バグは、テストを実施することなく保護することはできません。

したがって、合理的なアプローチは、いくつかの重要な使用事例をカバーするいくつかのシステムレベルのテストを取得することです。これは、アプリケーションの周りの一種の「テスト用足場」として機能します。つまり、アプリケーションを修正する際にバグを導入する危険性を低くして、より低レベルのテストをより安全に導入できるようになります。これが実現すると、変更する前にコードを変更したときに開発者がテストを書く必要があるポリシーを導入することができます。これにより、アプリケーションの自動テストを有機的に拡張できます。

Working Effectively with Legacy Codeを入手することを強くお勧めします。この優れた本は、ほとんどテストを自動化していない既存のアプリケーションにテストを導入するためのあらゆる有用なテクニックを網羅しています。

モッククラス内にモックデータを作成してテストする必要があるかどうかについての質問は、テストバージョンのオブジェクトを注入するときに取ることのできるアプローチの1つですが、おそらくベストではありません。 Mockitoのような模擬フレームワークを使うことで、明確に定義された振る舞いを持つモックオブジェクトを簡単に作成することができます。あなたの場合、Mockitoを使ってモックモデルの実装を作成し、それに依存するオブジェクトにモックモデルを挿入することができます。

+0

+1本書は+1、Mockitoは+1、良い答えは+1 - あまりにも悪い – weltraumpirat

0

彼らはユニットテストではありません。それらは統合テストです。

はい、ユニットテストのクラスを分離するには、mockを使用します。

0

ユニットテストでは、プログラムの一部だけをテストする必要があります。他の部品を使用すると、統合テストになります。

統合テストでは、部品がうまく機能していることを確認し、必要な作業を行っていないことを確認します。

ユニットテストでは、部品が行う必要があることをチェックします。

これは2つのテストの違いです。

ユニットテストのリファクタリングでは、デザインパターンDependency Injectionを探すことができます。

関連する問題