2017-02-07 4 views
1

Einige Hintergrundinformationen, bevor ich in meine Frage komme. Ich arbeite gerade an einem Projekt, das von einem IBM DB2 zu einem SQL Server migriert. Um nicht zu sehr ins Detail zu gehen, trennt dieser DB2-Verbindungsserver manchmal die Verbindung zum SQL-Server, was für verbundene Server normal ist. Ich habe dies in Code arbeiten und haben ein Prozess-Setup für dieses um es zu kümmern.Unit Test für bestimmte Arten von Ausnahmen

Wie auch immer, ich versuche, eine Testmethode zu schreiben, die eine DbException auslöst (die Ausnahme, die ausgelöst wird, wenn der Verbindungsserver nicht verbunden ist), um den Prozess zu testen, den ich schrieb, wenn der Verbindungsserver getrennt ist. Gibt es eine Möglichkeit, einen bestimmten Typ von Ausnahme zu erzwingen, damit ich meinen Code testen kann?

Der try catch-Block sieht wie folgt aus etwas:

try 
{ 
    //Regular Processing and attempt to update to DB2 
} 
catch (DbException ex) 
{ 
    //Other processing to catch a linked server issue 
} 
catch (Exception ex) 
{ 
    //Even more processing for other exceptions 
} 

Antwort

2

Es ist das gleiche Verfahren wie die meisten Unit-Tests, spritzen Sie Ihre Abhängigkeit über eine Interface, setzen Sie Ihre echte Db-Logik in einer Klasse basierend auf dieser Schnittstelle, und Ihre Test-Zeug in einem anderen basierend auf dieser Schnittstelle.

interface IDBProcessor 
{ 
    void Process() 
} 

class ThrowyClass : IDBProcessor 
{ 
    public Exception ThrowThis {get; set;} 
    public void Process() 
    { 
     throw ThrowThis; 
    } 
} 


void MyMethod(IDBProcessor processor) 
{ 
    try 
    { 
    processor.Process() 
    } 
    catch (DbException ex) 
    { 
    //Other processing to catch a linked server issue 
    } 
    catch (Exception ex) 
    { 
    //Even more processing for other exceptions 
    } 
} 

Dann in Ihrem Gerät zu testen, Machen Sie einen ThrowyClass mit Ausnahme Sie wollen und geben es in. (Es gibt spöttischen Frameworks, die Sie davon ab, eine Test-Klasse speichern, wenn Sie möchten).

[Test] 
void MyThrowTest() 
{ 
    var throwy = new ThrowyClass() { ThrowThis = new SomeSpecificException() }; 
    var myClass = new MyClass() 
    myClass.MyMethod(throwy); 
    // Assert what you expect 
} 

Sie müssen die Dinge an Ihre spezifische Anwendung anpassen. können Sie möchten die IProcessor im Konstruktor „MyClass“

0

Sie können einfach wie auf diese Weise werfen:

throw new DbException(); 
+1

' DbException' ist eine abstrakte Klasse. Sie müssen entweder eine benutzerdefinierte Ausnahmeklasse erstellen, die daraus abgeleitet werden kann, dann Ihre benutzerdefinierte Klasse oder einen vorhandenen Typ, der von DbException wie SqlException abgeleitet ist. –

+0

Sie haben Recht, ich habe gelernt, es war nur eine gewöhnliche Klasse, die von der Exception-Klasse erbt –

0

Sie einen Blick auf IDbConnection und versuchen, den Moq Rahmen nehmen sollte injizieren
Code mögen, sollten die folgenden

var dbConnectionMock = new Mock<IDbConnection>(); 
dbConnectionMock.Setup(x => x.Open()) 
        .Callback(() => { 
          throw new SqlException(); 
         }).Verifiable(); 

https://github.com/Moq/moq4/wiki/Quickstart