5

私は Web アプリケーション開発にかなり慣れていないので、現在、いくつかのテスト機能を実装するのに苦労しています。

私が現在取り組んでいるプロジェクト (支払いを処理するための MVC 3 Web アプリ) の一環として、次の方法で URL からアクセスできるテストモードを作成するように依頼されました。

http://websiteurl?testmode=1

この背後にある考え方は、開発チームの 1 人が testmode パラメーターを URL に追加すると、アプリケーションがテストされるたびにデータを入力する時間を節約するために、一連のフォーム値が自動生成されるというものです。

現在、コントローラーに Request.QueryString を使用して以下のパラメーターを設定する if ステートメントがあります。現在使用しているコードは次のとおりです。

if (Request.QueryString.AllKey.Contains("tm"))
{
     if (Request.QueryString["tm"] == 1)
     {
         insert values to be generated
     }
}

コンテキストを考えると、これを達成するための最良の方法は何ですか?

データベースから結果を取得するのではなく、Moq や RhinoMocks などのモック フレームワークを使用して偽のリポジトリを作成することは可能でしょうか?それとも、テスト データをデータベースにプリロードした方がよいでしょうか?

4

2 に答える 2

2

まず、「TestMode」チェックをカプセル化します。

ベース コントローラーを作成し、次のプロパティを追加します。

// I would consider retrieving this from web.config
protected string testModeKey = "tm";

public bool IsTestContext
{
   get
   {
      return Request.QueryString[testModeKey] != null;
   }
}

または、HttpRequest の拡張メソッドを作成することを検討してください。

public static bool IsTestContext(this HttpRequest request, string testModeKey = "tm")
{
   request.QueryString[testModeKey] != null;
}

これは途方もないことです。値を挿入する方法を考えてみましょう。ここではいくつかの仮定を置いていますが、コントローラーを単体テスト可能にすることに興味があります。

あなたのデータはいくつかから返され、IDataRepositoryFakeDataRepository と ReadDataRepository の 2 つのリポジトリの実装があると仮定しています。

次に、ファクトリまたは単純な ifelse ステートメントを記述して、使用するリポジトリを決定できます。

IDataRepository DataRepository { get; set; }

if (Request.IsTestContext)
   DataRepository = new FakeDataRepository();
else
   DataRepository = new RealDataRepository();

これはあなたがやりたいことにはうまくいきますが、私の意見では良い方法ではありません。コントローラーの単体テストを検討します。ここではかなりの数の仮定と推測を行っているため、テストしたい内容について詳しく教えていただけますか?

于 2012-09-05T13:20:33.957 に答える
0

アプリケーションが現在どのようにレイアウトされているかについていくつかの詳細を把握できるように、以下に詳細を示します。

アプリケーションの基本構造は、プロジェクト シルク テンプレートに従い、アプリケーションをビジネス ロジック、データ層、プレゼンテーション、単体テストに分割します。このテストモードを実装しているコントローラーは、現在の実装を含むベース コントローラーから既に継承していますMicrosoft.Practices.ServiceLocation パターン。

サービス ロケーターは、ビジネス ロジック ドメイン プロジェクトにある 4 つのサービスにアクセスします。これらのリポジトリのうち 3 つが、3 つのドロップダウン リストの値を含むリポジトリにアクセスします。4 つ目は、アプリに統合された支払いソリューション (SagePay) のトランザクション サービスの実装にアクセスします。これは SagePayMvc.dll を使用します。

すべてのリポジトリはベース リポジトリから継承します。現在、このベースから継承する 6 つのリポジトリがあります。3 つはドロップダウン リストを作成するためのものです。残りの 3 つは、学生、カード所有者、および注文の詳細に関する情報を保存します。テストモードでは、基本的に学生リポジトリにアクセスします。現在、学生の詳細フォームに入力する予定です。現在、カード所有者の詳細は、JQuery を使用して入力できます。

モデルの 2 つのセットがあり、1 つはビジネス ロジックに、もう 1 つはデータ層にあり、モデルの検証はビジネス ロジック ドメインで定義されます。

モデルにアクセスするためのビュー モデルは、現在ドメイン モデルを使用しています。

Entity Framework Code First アプローチを使用しているリポジトリを作成するために、現在、テーブルが定義済みの各モデルに対応するデータベースとしてリポジトリを作成しています。

このテストモードの目的は、一意ではないフォーム フィールドにすばやくデータを入力することです (現在、学生が既存の名前を入力できないようにするロジックを実装しています)。これにより、チームの他のメンバーがアプリケーションを使用しているときに、すばやく評価できるようになります。アプリケーションが機能している場合、特にアプリケーションにスタイリングを適用する設計チームにとっては重要です。

私は現在、学生リポジトリがここで定義したデータが Moq を使用して定義された偽のリポジトリにアクセスする新しい学生を作成できるというアサーションをテストする 1 つのテスト クラス セットアップを持っています。

于 2012-09-06T08:02:41.890 に答える