2011-12-16 2 views
3

ビューレイヤをテストします。ビューレイヤをテストするためのコントローラの方法を模擬してください

私はウェブ・ドライバ・テスト(機能テスト)はテストページのリストとしてを示すことがデータができ、その持っている方法

class Controller ... { 
public void do() { 

    List<String> data = .... 

    render(data); 
} 
.. 
} 

有するコントローラを有します。

PlayFrameworkのコントローラで、do()メソッドを模擬して、どこかからフェッチしている実際のデータに依存しないようにするにはどうすればよいですか?共通のアプローチは何ですか?特定のテストで嘲笑された場合、このコントローラーの方法をプレイが知っている/使用する方法は?

- いくつかのコメント(THX)を得た後に追加:

をコントローラがそれに戻っていくつかのデータを返すとき、私はちょうどビューをテストしたいです。

私のコントローラのロジックはまだ準備ができていません。私はそれが< Stringのリストを返すことを知っています。ビューでは、この文字列を< li> html要素に表示する必要があります。それでおしまい。

私はコントローラを実装して、データベースまたはWebサービスを使用してビューにデータを返すようにしています(コントローラーの内部に何も偽装できないようにします)。Http.get )..またはDatabase.get())..

  • 私は私のコントローラを実装する方法をまだ知らない、私は今それを返すだろうか - それにもかかわらず、ビューのためにコントローラがそのをどうするかは問題ではありません。ワークビューはこれらのデータを表示するだけで、htmlのリストのようなデータを表示できるかどうかをテストしたい。

答えて

1

私はPlayFrameworkについて何も知らないが、これはユニットテストMVCで発生するよくある質問である。一般的には、すべてのものが機能するかどうか、およびモデルの単体テストをテストする「機能的」テストまたは統合テストがあります。 100%のコードカバレッジを望むこととは別に、実際にこのコードをテストする必要があるかどうかを自問する必要があります。

あなたが行うことを決定した場合は、その後、私はあなたがテストしたい関数にモックオブジェクトを注入するdependecy注入を使用するように機能をリファクタリングすることになります。しかし、統合テストの対象となる単体テストコードにリファクタリングの負荷をかけなければならない場合は、本当に必要ですか?

+0

私はそこに説明を追加しました。 (返信用のThx、とにかく) – ses

0

ビューレイヤーをテストする場合は、Seleniumを使用します。 Playから提供されています。

また、あなたはテストのために特別なデータベースの構築を使用することができます。

は、コントローラを模擬しようとしないでください:あなたのテストのためにそれにインメモリデータベース(非常に高速)と負荷データを使用しています。

は、あなたの更新の後に追加:あなたは、コントローラを開発するまで

たぶん、あなたはリストをハードコーディングできます。

3

データを取得するためのメソッドを使用して、インターフェイスを作成します。

public interface DataProvider { 
    public List<String> getData(); 
} 

テストのために、このインターフェイスをいくつかのテスト値を提供するクラスで実装できます。

その後、あなたは(データベース、ウェブ要求、何でも)あなたがもう一度あなたのインターフェイスを実装してデータをフェッチどこから知っているときに
public class MockDataProvider implements DataProvider { 
    public List<String> getData() { 
     String[] testData = {"a","b","c"}; 
     return Arrays.asList(testData); 
    } 
} 

あなたのコントローラでは、テストモードであるかどうかを切り替えることができます。

class MyController ... { 
    public static void datalist() { 
     DataProvider provider; 

     if (Play.runingInTestMode()) { 
      provider = new MockDataProvider(); 
     } else { 
      provider = new WebProvider(); 
     } 

     List<String> data = provider.getData(); 
     render(data); 
    } 
} 
関連する問題