これは、モックを使用してテストコードを単体テストしようとする場合の問題に似ています。
SqlCommand
1つの方法は、コード内の使用を、メソッドを含むインターフェイスを実装するオブジェクトに置き換えるExecuteReader
ことです。そうすれば、おそらくファクトリパターンを使用して、オブジェクトをより簡単に置き換えることができます。
したがって、次のようなコードを置き換えることになります。
using (SqlCommand command = new SqlCommand(query))
{
command.ExecuteReader();
}
と:
var sqlCommandFactory = new SqlCommandFactory();
using (ISqlCommand command = sqlCommandFactory.CreateSqlCommand(query))
{
command.ExecuteReader();
}
まず、置換するメソッドを含むインターフェースを定義します。
public interface ISqlCommand
{
SqlDataReader ExecuteReader();
// further interface methods here...
}
SqlCommand
次に、コンストラクターと同じシグニチャーを使用するファクトリを作成します。
internal class SqlCommandFactory
{
bool _useMyClass = true;
public ISqlCommand CreateSqlCommand(string query)
{
if (_useMyClass)
{
return new MySqlCommand(query);
}
else
{
return new SqlCommandWrapper(query);
}
}
}
MySqlCommand
次に、クラスに代替コードを記述します。
public MySqlCommand : ISqlCommand
{
public SqlDataReader ExecuteReader()
{
// your new code here
}
}
.NETSqlCommand
クラスは明らかに新しいインターフェイスを実装していないため、ISqlCommand
これを行うラッパークラスを作成します。
public SqlCommandWrapper : ISqlCommand
{
SqlCommand _sqlCommand;
public SqlCommandWrapper(string query)
{
_sqlCommand = new SqlCommand(query);
}
public SqlDataReader ExecuteReader()
{
_sqlCommand.ExecuteReader();
}
}
少し余分な作業がありますが、このメソッドの利点は、ユニットテスト(模擬ファクトリをコードに渡すことによって)を含め、実装を必要なものに変更できることです。
追加の作業は1回限りで、要求に応じて名前と元のメソッドシグネチャを保持する必要があります。これにより、特にあなた(またはあなたのチーム)がこのよく知られたパターンに慣れると、コードがより親しみやすく理解しやすくなります(カスタム/拡張メソッドと比較して)。