インターフェイスの実装を単体テストしようとしていますが、SqlTransaction パラメーターをインターフェイス メソッドの 1 つに正常にモックアウトするのに少し苦労しています。
私が興味を持っているインターフェイスとテスト中のメソッドは次のようになります..
public class MyInterface
{
void MyMethod(SqlTransaction SharedTransaction, DateTime EventTime);
}
public class MyImplementation : MyInterface
{
public void MyMethod(SqlTransaction SharedTransaction, DateTime EventTime)
{
DateTime dtLastEventTime = DateTime.MinValue;
using(SqlCommand comm = SharedTransaction.Connection.CreateCommand())
{
comm.CommandText = SQL_GET_LAST_EVENTTIME_DEFINED_ELSEWHERE;
comm.Parameters.AddWithValue("ParamName", 123);
object oResult = comm.ExecuteScalar();
dtLastEventTime = DateTime.Parse(oResult.ToString());
}
//Do something with dtLastEventTime
}
}
私はMoqとさまざまな構文アプローチを使用してデータベースオブジェクトをモックアウトしましたが、あまり運がありませんでした.. DbTransaction、DbConnection、DbCommand など)。
私が知りたいのは、主に、この方法でトランザクションをモックアウトできるかどうか、またはここで間違ったツリーを吠えているかどうかです。幸いなことに、プロバイダー固有の SqlTransaction ではなく、一般的な DbTransaction パラメーターを使用するようにインターフェイスを変換できる可能性がありますが、それがモック化に苦労している理由であるとは確信していません。
これが(そしてこれは完全に間違っている可能性があるので、私がこれに間違って近づいている場合は私を修正するかコメントしてください)コードをモックするためにこれまでに得たものです...
var mockParams = new Mock<DbParameterCollection>();
mockParams.Setup(p => p.Add(new SqlParameter("ParamName", 123)));
var mockCommand = new Mock<DbCommand>();
mockCommand.Setup(p => p.Parameters).Returns(mockParams.Object);
var mockConnection = new Mock<DbConnection>();
mockConnection.Setup(con => con.CreateCommand()).Returns(mockCommand.Object);
var mockTrans = new Mock<DbTransaction>();
mockTrans.Setup(t => t.Connection).Returns(mockConnection.Object);
ただし、これは mockCommand.Setup 行で ArgumentException をスローするようです.. (オーバーライドできないメンバーでの無効なセットアップ)
モックされた SqlTransaction パラメータを使用してこのメソッドを正しく単体テストする方法について、アイデアや提案はありますか?