Ist es möglich, zu Verhöhnen, eine Datenbank-Transaktion-parameter?

Ich versuche ein unit-test-meine Implementierung einer Schnittstelle, und ich habe ein wenig Schwierigkeiten erfolgreich Spott sich eine SqlTransaction-parameter an eine der Methoden der Schnittstelle.

Hier ist, was die Schnittstelle und die zu testende Methode, die ich bin interessiert in Aussehen..

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
  }
}

Habe ich mit Moq und verschiedenen syntax-Ansätze zum simulieren der Datenbank-Objekte und nicht viel Glück.. (ich hatte zu tun, einige Umstellung auf das System.Daten.Gemeinsame Objekte, um in der Lage sein, ein wenig weiter.. DbTransaction, DbConnection, DbCommand, etc).

Was ich wissen möchte ist vor allem, ob es möglich ist, zu verhöhnen, aus einer Transaktion auf diese Weise, oder ob ich auf dem Holzweg hier. Zum Glück habe ich vielleicht in der Lage sein, um die Schnittstelle konvertiert, verwenden Sie eine generische DbTransaction parameter, anstatt die provider-spezifischen SqlTransaction, aber ich bin nicht davon überzeugt, dass 's warum ich' m haben eine harte Zeit mit Spott.

Hier ist (und das könnte vollkommen falsch sein, so bitte korrigieren Sie mich, oder Kommentar, wenn ich an dieses incorretly) was habe ich bisher für Spott code...

   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);   

Jedoch scheint dies löst eine ArgumentException aus, auf die mockCommand.Setup-line..
(Ungültige Einstellung auf eine nicht-überschreibbare Mitglied)

Hat jemand irgendwelche Ideen oder Vorschläge, wie ich vielleicht in der Lage, richtig zu unit-testen Sie diese Methode mit einer verspottet SqlTransaction-parameter?

Schreibe einen Kommentar