2009-06-05 4 views
1

Ich habe einen Klumpen von Code, der ein bisschen wie folgt aussieht:Unit-Tests für ungültige ENUM-Wert

If mode = DiaryMode.Admin Then 
    modeObject = DBNull.Value 
ElseIf mode = DiaryMode.Academy Then 
    modeObject = ApplicationSettings.Academy 
ElseIf mode = DiaryMode.Scouting Then 
    modeObject = ApplicationSettings.Scouting 
Else 
    Throw New NotSupportedException() 
End If 

Die Idee der Überprüfung einige Werte für das Bestehen in einem Datenbank-Aufruf prep.

Es gibt zwei Fragen, ist die Else die Mühe wert? Die Absicht ist, zukünftige Erweiterungen der Enumeration zu verhindern, die bewirken, dass der Code die Ergebnisse von Squify zurückgibt.

Wenn der Code gültig ist, würde ich gerne in der Lage sein, das Verhalten der Einheit zu testen, wenn es sich lohnt, es zu testen. Wie könnte ich das machen?

Antwort

0

Wenn Ihre geschäftlichen Anforderungen angeben, dass kein anderer DiaryMode zulässig ist, ist eine else -Anweisung eine gute Möglichkeit, zukünftige Erweiterungen in Ihrer DiaryMode-Enumeration zu verhindern.

Zum Testen wird das ein bisschen komplizierter. Ich würde alle gültigen Zustände (Admin, Akademie und Scouting) sicher testen. Sie können den Modus jedoch nicht wirklich auf einen Enumerationswert setzen, der nicht vorhanden ist, und dies wäre die einzige Möglichkeit, die NotsupportedException auszulösen. Ich könnte versuchen, einen Test zu schreiben, der verifizieren würde, dass das Enum nur die Enumerationen enthält, die Sie erwarten.

könnten Sie tun, indem Sie so etwas wie dies zu tun:

Enum.GetNames(typeof(DiaryMode)) 

und dann jeden Namen zu überprüfen.

Zusammenfassend, Sie hätten 4 Tests von dem, was ich beschrieben habe.

  • Admin Test
  • Academy Test
  • Scouting Test
  • -Test, der alle Namen in der DiaryMode Enum prüft
+0

Dies scheint die am besten geeignete Antwort in meinem Szenario, danke. – ilivewithian

+0

Ich bin froh, dass ich helfen konnte! – Joseph

0

Sie möchten dies lieber mit Replace Conditional with Polymorphism umgestalten.

Das Schreiben eines Testfalls für diese Zeilen wird beweisen, dass die "if ... then ... else" -Anweisung das korrekte modeObject zurückgibt, aber ich würde nicht viel Zeit darauf verwenden. Es ist jedoch möglicherweise nicht völlig sinnlos: Wenn Sie neue Modi hinzufügen möchten, wird der Test sicherstellen, dass sie wie erwartet gehandhabt werden, besonders wenn es eine geschnittene Paste geben wird (es ist nicht ungewöhnlich, den Code einzufügen und zu scheitern) modifiziere es entsprechend).

Das ist, was ich tun würde: Ich würde die Testfälle schreiben, dann umgestalten, um eine Hierarchie von Klassen zu haben, die die Modi behandeln, und dann die Tests wiederholen, um sicherzustellen, dass ich nichts kaputt gemacht habe. Klingt wie ein Plan?

0

Hinzufügen der Else scheint vernünftig genug. Wenn Sie den integrierten Visual Studio-Komponententest verwenden, gibt es tatsächlich ein Attribut, das angibt, dass Sie erwarten, dass ein Test eine Ausnahme für Erfolg auslöst: ExpectedExceptionAttribute.