これは、モックを使用してテストコードをユニット化しようとするときの問題と似ています。
一方的に、SqlCommand
のコードを、ExecuteReader
メソッドを持つインターフェイスを実装するオブジェクトに置き換えます。おそらく、ファクトリパターンを使用して、オブジェクトをより簡単に置き換えることができます。
ですから、このようなコード置き換えます:次に作成
public interface ISqlCommand
{
SqlDataReader ExecuteReader();
// further interface methods here...
}
:
まずあなたが代わりに使用するメソッドが含まれているインタフェースを定義する
var sqlCommandFactory = new SqlCommandFactory();
using (ISqlCommand command = sqlCommandFactory.CreateSqlCommand(query))
{
command.ExecuteReader();
}
:と
using (SqlCommand command = new SqlCommand(query))
{
command.ExecuteReader();
}
をSqlCommand
コンストラクタと同じシグネチャを使用するファクトリ:
internal class SqlCommandFactory
{
bool _useMyClass = true;
public ISqlCommand CreateSqlCommand(string query)
{
if (_useMyClass)
{
return new MySqlCommand(query);
}
else
{
return new SqlCommandWrapper(query);
}
}
}
その後、MySqlCommand
クラスであなたの代替コードを書く:.NET SqlCommand
クラスとして
public MySqlCommand : ISqlCommand
{
public SqlDataReader ExecuteReader()
{
// your new code here
}
}
を明らかに、新しいISqlCommand
インタフェースを実装し、これを行うラッパークラスを作成しません。
public SqlCommandWrapper : ISqlCommand
{
SqlCommand _sqlCommand;
public SqlCommandWrapper(string query)
{
_sqlCommand = new SqlCommand(query);
}
public SqlDataReader ExecuteReader()
{
_sqlCommand.ExecuteReader();
}
}
少し余分な作業ですが、この方法の利点は、実装をあなたのものに変更できることです(あなたのコードにモックファクトリーを渡すことによる)ユニットテストのためのものを含む
余分な作業は一回限りで、必要に応じて名前と元のメソッドの署名を保持する必要があります。これは、特にあなた(またはあなたのチーム)がこのよく知られているパターンに慣れたときに、あなたのコードをより使い慣れたものにして理解しやすくします(カスタム/拡張メソッドと比較して)。
は私にとっては悪い考えです。 – lahsrah
オーバーロードのように見えるように、いくつかの余分なオプションのパラメータで拡張メソッドを使用することはできますか?申し訳ありませんが、私はそれに答える代わりに質問しています。 – shahkalpesh
プロファイリングAPIを使用しているか、何かが本当にハックしている可能性があります。カップル年前からこの1つがここにありますhttp://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer butsは本当にハックです – AbdElRaheim