4

私は単体テストに比較的慣れておらず、モッキングにもまったく慣れていません。データベースに接続せずに単体テストを作成したい DbProvider ファクトリをラップするデータベース クラスがあります。

クラスをテストするために渡すことができるように、DbProvider ファクトリをモックするにはどうすればよいでしょうか。DbConnection、DbCommand などもモックする必要がありますか? 私のコードの小さなサンプルは次のとおりです。

public Database(DbProviderFactory dbProviderFactory) {
    Provider = dbProviderFactory;
}

public int UpdateRecords(string sql, CommandType type, params DbParameter[] parameters) {
    int numberOfRecordsUpdated;

    using (var connection = CreateConnection()) {

        // Add ConnectionString
        connection.ConnectionString = ConnectionString;

        // Create command to hold the update statment
        using (var command = CreateCommand()) {
            try {
                command.Connection = connection;
                command.CommandType = type;
                command.CommandText = sql;

                // Add Parameters
                foreach (var parameter in parameters) {
                    command.Parameters.Add(parameter);
                }

                // Open Connection
                connection.Open();

                // Execute SQL
                numberOfRecordsUpdated = command.ExecuteNonQuery();
            } finally {
                command.Parameters.Clear();
            }
        }
    }

    return numberOfRecordsUpdated;
}
4

3 に答える 3

2

統合テスト


データベースからデータを取得するテストに(コメントから判断して)興味がある場合は、integration test.

これらのタイプのテストとの違いunit testingは、実行される頻度が少ないことです。ベスト プラクティスでは、ソース管理にコミットする前にこれらを実行する必要があります。

その理由は、速度が遅く、実際のデータベース (少なくともテスト データベース) にアクセスすることになるからです。実行するたびに、データベースを消去するか、変更をコミットしないようにする必要があります。ここで何をしているのかを知っているようですので、これをどのように処理するかはあなた次第です。

あざける


mockingデータベースを 使用するロジックのテストについてdependency injectionは、これが道です。

私はMoqを使用しています- おそらく最も簡単に使用できるモッキング フレームワークです。実際には (名前にもかかわらず) モック オブジェクトだけではなく、それを使用してスタブとフェイクを生成できます。

疑似モッキングは次のようになります (DB の例を使用):

  • モックを設定する
  • 何をするか (期待) を伝えます - たとえば、保存の呼び出し。
  • SUT (System Under Test) を使用する
  • モックを検証します - この場合、SUT 内で save メソッドが呼び出されました。

さらにヘルプが必要な場合は、Google をチェックしてください。単体テストとモック作成のための優れたリソースがいくつかあります。

于 2009-09-16T20:46:11.737 に答える
1

私なら、より高いレベルのデータ アクセス機能 (UpdateRecords など) を含むクラスを個人的にモックし、このモックを使用して所定のデータセットを返します。

DbProvider および対応する DbCommand などの使用は、データ アクセス レイヤーの実装の詳細であり、戻り値を使用するより高いレベルの機能には実際には関係ありません。

于 2009-09-16T20:46:59.367 に答える
0

データアクセスクラスはすべて、DBとの統合に関するものです。たとえば、Roy Osheroveは、単体テストの際にこのクラスを例外と見なします。このタイプのコードをテストする方法にも興味があります。質問は+1。

IOWデータアクセスクラスをあざけるのが賢明かどうかはわかりません。

ユニットテストに関しては、何をテストしないのですか?

于 2009-09-16T12:54:41.173 に答える