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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Peter, ich gehe davon aus SQL-Server-backend.
First off, würde ich umgestalten MyMethod() oder durch ändern der eingehenden parameter Typ IDbTransaction auf MyMethod (), so dass Sie weitergeben können, in Ihrer zu spotten. Dann würde ich abstrahieren Sie die ExecuteScalar () - Aufruf, so konnte ich leicht überprüfen Sie das SqlCommand-Parameter in meinem test.
Seit Moq unterstützt rekursive Spott, in der Prüfung würde ich verspotte die rufen auf sharedTransaction wie diese:
Erstellen Sie eine weitere mock für die überprüfung der Befehlsparameter in Ihrer Methode und gibt einen Wert zurück, auf die ExecuteScalar () - Aufruf, und fertig!
Umgestaltet MyMethod():
Test:
Persönlich, ich mag zum testen der Parameter auf meine SqlCommand ruft, so Griff ich Ihr problem aus diesem Winkel in meinem Beispiel.