Kann ich einen SqlDataReader und Werte ohne wieder ein SqlDataReader-von einem anderen Objekt wie z.B. SqlCommand.ExecuteReader()
Schreibe ich unit-tests für mein data access layer. Um dies zu erreichen habe ich einen wrapper für SqlCommand (ISqlCommand), so dass ich verspotten seine Funktionalität.
ISqlCommand command = _connection.GetSqlCommand(sqlCommand);
In einer der Methoden, die ich Teste, SqlCommand-die ExecuteReader-Methode aufgerufen wird, und ich habe die Rückgabe eines SqlDataReader.
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow);
In dieser Methode reader.Gelesen wird aufgerufen
if (reader.Read())
{
someVariable = reader.GetString(1);
}
Was ich will, ist wieder ein SqlDataReader-Objekt aus der verspottet Befehl.ExecuteReader() mit einem Wert für mich zu Lesen. Kann es getan werden? Es scheint, dass SqlDataReader kann nur instanziiert werden von einem tatsächlichen SqlCommand.ExecuteReader ausgeführt wird, und die Rückkehr eines SqlDataReader-Objekts verwenden.
Komplette relevante code getestet werden.
ISqlCommand command = _connection.GetSqlCommand(sqlCommand);
using (command)
{
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow);
if (reader.Read())
{
dbVersion = reader.GetString(1);
}
}
EDIT: klar, was ich verlange. SqlDatareader hat keinen öffentlichen Konstruktor. Soweit ich sagen kann, ich nicht schreiben kann, werden alle tests mit dieser Klasse, da ich nicht instanziieren, ohne einen legitimen Aufruf zu einer Datenbank, die SqlCommand. Auch versuchen, eine Schnittstelle zu erstellen, der eine SqlDataReaderWrapper nicht mir helfen wie das problem ist das gleiche. Ich versuche nicht, zu schreiben Integrationstest (was der tatsächlichen Anrufe an eine DB) und damit der DataReader scheint unmöglich zu testen, wie es ist. Meine Frage ist nun, gibt es irgendetwas, was ich tun kann, um Werte in einem SqlDataReader in dieser situation?
- Ich nehme an, du suchst das
IDataRecord
- interface bietet Zugriff auf die Werte in der Spalte in jeder Zeile für einen DataReader. Sie können einfach werfen die Leser es:var record = (IDataRecord)reader;
. - Kasse diesem MSDN-link IDataReader msdn.microsoft.com/en-us/library/system.data.idatareader.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gehe davon aus, dass Sie nicht mit einem mocking-framework. Würde es helfen, so zu tun, aber man sollte wohl mock die IDataReader wie oben vorgeschlagen. Hier ist eine Vorherige Frage, die verwendet RhinoMocks. das kann helfen.
Mocking ein DataReader und ein Rhino.Mocks.Ausnahmen.ExpectationViolationException: IDisposable.Dispose(); Erwartet #0, Aktuelle #1
Außerdem habe ich bemerkt, dass Sie aus einer ISqlCommand ich schlage vor, Sie verwenden IDbCommand-es ist der aus der box-Oberfläche und machen Ihre tests weniger spröde als es erlaubt substitution von anderen command-Objekte, wenn nötig.
Ich nur über den Data Reader und es läuft wunderbar:
Ist hier ein gutes Beispiel: http://www.codeproject.com/Articles/478504/Moq-Mock-Database