116 Stimmen

Wie man eine SqlException auslösen, wenn für Mocking und Unit Testing benötigt?

Ich versuche, einige Ausnahmen in meinem Projekt zu testen und eine der Ausnahmen, die ich abfangen ist SQlException .

Es scheint, dass Sie nicht gehen können new SqlException() so bin ich nicht sicher, wie ich eine Ausnahme vor allem ohne irgendwie Aufruf der Datenbank auslösen kann (und da diese Unit-Tests sind es in der Regel empfohlen, nicht die Datenbank aufrufen, da es langsam ist).

Ich verwende NUnit und Moq, aber ich bin mir nicht sicher, wie man dies vortäuscht.

Als Antwort auf einige der Antworten, die alle auf ADO.NET zu basieren scheinen, beachten Sie, dass ich Linq to Sql verwende. Also ist das Zeug wie hinter den Kulissen.

Weitere Informationen auf Anfrage von @MattHamilton:

System.ArgumentException : Type to mock must be an interface or an abstract or non-sealed class.       
  at Moq.Mock`1.CheckParameters()
  at Moq.Mock`1..ctor(MockBehavior behavior, Object[] args)
  at Moq.Mock`1..ctor(MockBehavior behavior)
  at Moq.Mock`1..ctor()

Postet in der ersten Zeile, wenn es versucht, ein Mockup zu erstellen

 var ex = new Mock<System.Data.SqlClient.SqlException>();
 ex.SetupGet(e => e.Message).Returns("Exception message");

0voto

Oleg D. Punkte 1184

Sie können Reflection verwenden, um das SqlException-Objekt im Test zu erstellen:

        ConstructorInfo errorsCi = typeof(SqlErrorCollection).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[]{}, null);
        var errors = errorsCi.Invoke(null);

        ConstructorInfo ci = typeof(SqlException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string), typeof(SqlErrorCollection) }, null);
        var sqlException = (SqlException)ci.Invoke(new object[] { "Exception message", errors });

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X