3

私はこのようなメソッドを持っています:

public static bool ChangeCaseEstimatedHours(int caseID, decimal? time)
   {
       Case c = Cases.Get(caseID);

       if (c != null)
       {
           c.EstimatedHours = time;
           return Cases.Update(c);
       }

       return false;
   }

   public static bool RemoveCase(int caseID)
   {
       return Cases.Remove(caseID);
   }

内部でLINQを使用してクエリを実行します。

これらをどのようにテストすればよいのでしょうか。状態がないため、静的です。また、データベースを変更します。

したがって、ケースを作成してから同じテストで削除する必要がありますが、単体テストでは1つのことだけを実行する必要があります。これらの状況では通常何が行われますか?

データベースのクエリ、更新、削除をテストするにはどうすればよいですか?

ありがとう

4

3 に答える 3

2

データベースへのアクセスが必要なテストは、おそらく維持するのが最も難しいテストです。単体テストでデータベースに触れないようにすることができれば、 Cases クラスのインターフェースを作成してみます。

interface ICase
    {
        ICase Get(int caseID);
        bool RemoveCase(int caseID);
    }

次に、RhinoMock、Moq を使用して、Get() と RemoveCase() が呼び出されたかどうかを確認します。

データベースでテストする必要があると主張する場合は、テスト用データベースのセットアップと適切なデータのクリーンアップに時間を費やす必要があります。

于 2013-01-21T21:43:43.887 に答える
1

「道を知ることと道を歩くこと」には違いがあります。テストしたいものは、単体テストではなく統合テストとして分類されます。単体テストは、外部に依存することなく分離して実行されるものであるため、テストを実行しているマシンに物理データベース インスタンスが存在しなくてもテストを実行できます。その他の違いについては、こちらをご覧ください。

そのため、Repository のようなパターンは、モッキングを介してデータ層の単体テスト機能を促進するため、永続性ベースのアプリケーションを実行する場合に非常に人気があります。ここでサンプルを参照してください。

したがって、2 つのオプションがあります (青い錠剤または赤い錠剤)。

Blue Pill: TypeMock Isolator essentialJustMockなどのツールを購入すると、コード内のあらゆるものをモックできるようになり、"話は終わり" になります。

Red Pill: データ層の既存の設計をインターフェイス ベースのパターンの 1 つにリファクタリングし、MoqRhinoMocksなどの無料のモッキング フレームワークを使用して、「うさぎの穴がどれほど深くなるかを確認してください」

ではごきげんよう。

于 2013-01-21T22:29:28.847 に答える
1

おそらく、Rails フレームワークに基づくアプローチを検討できます。

  1. プリセット (Rails のフィクスチャ) を介してデータベース テーブルの内容を初期化します。
  2. 取引を開く
  3. テストを実行
  4. ロールバック トランザクション
  5. ポイント 2 に進みます。別のテストで
于 2013-01-21T21:38:51.593 に答える