2016-07-29 3 views
1

Ich habe eine Methode mit folgendem Code:Wie Unit-Test-Verfahren mit, wenn sonst und keine Rückgabebedingung

public void myMethod() { 
    if (condition1) { 
     doSomething1(); 
     if (condition2) { 
      doSomething2(); 
     } else { 
      doSomething3(); 
     } 
    } 
} 

Jetzt doSomething1, doSomething2, doSomething3 sind ungültig Methoden. Wie Unit-Test myMethod? zB: wenn Bedingung1 erfüllt ist, prüfen Sie, ob doSomething1 aufgerufen wurde.

Gibt es etwas, was wir tun können, um dies zu refaktorisieren, um es leicht testbar zu machen?

Antwort

1

Ein allgemeiner Ansatz könnte 3 Testfälle sein. Jeder Testfall würde eine einzige Bedingung erfüllen. Für jeden Testfall:

  • doSomethingX würde mit einem Testobjekt gepatcht werden, (es gibt Schein-Bibliotheken für so ziemlich alle Sprachen)
  • conditionX ausgelöst würde
  • doSomethingX
  • Test ausführen würde würde behaupten dass doSomethingX tatsächlich

Es gibt viele Strategien für die Beseitigung der Notwendigkeit genannt zu verspotten . Wenn doSomethingX eine Instanzmethode ist, können Sie eine test specific subclass erstellen und doSomethingX überschreiben und Ihre Assertion in der Unterklasse vornehmen.

Sie können auch Ihre Methode Refactoring den Anrufer erfordern die doSomethingX Abhängigkeit (Dependency Injection)

public void myMethod(somethingStrategy)

Dann wird der Test leicht ein Mock-Objekt konfigurieren konnte zu injizieren und myMethod mit dem Mock-Objekt aufrufen.

Die Abhängigkeitsinjektion kann auf Klassenebene erfolgen, indem die class be instantiated mit einer somethingStrategy ebenfalls verwendet wird.

0

(a) Die Tatsache, dass diese Methoden void zurückgeben bedeutet, dass ihr Ergebnis irrelevant ist, ist uns egal. Aber Sie müssen das Ergebnis testen und müssen daher das Ergebnis wissen. Das ist also eine riesige rote Flagge, dass der Code nicht fest ist und Refactoring benötigt.

(b) Hey, könnte dies Legacy-Code sein, der unmöglich zu ändern ist, also wenn Ihre Methoden wirklich Leerstellen sind, dann könnte das folgende Refactoring helfen, wenn Sie dann bestätigen, dass myNewMethod2 und doSomething2/3 einmal aufgerufen werden/eine weitere Strategie für Hohlräume, die ich bin kein großer Fan von, lässt aber Ihren ursprünglichen Code weitgehend intakt nicht bei allen depedndant von den Bedingungen (zB über MOQ Unit Testing Framework)

public myNewMethod() 
    { 
     bool cnd1 = (condition1); 
     bool cnd2 = (condition2); 
     if(cnd1) 
     { 
      myNewMethod2(cnd2); 
     } 
    } 

    public myNewMethod2(bool cnd2) 
    { 
     doSomething1(); 
     myNewMthod3(cnd2); 
    } 

    public myNewMethod3(bool cnd2) 
    { 
     if (cnd2) 
     { 
      doSomething2(); 
     } 
     else 
     { 
      doSomething3(); 
     } 
    } 

(c) genannt wird, ist dies:

public void myMethod() { 
     try 
     { 
      if (condition1) { 
      doSomething1(); 
      if (condition2) { 
       doSomething2(); 
      } else { 
       doSomething3(); 
      } 
     } 
     catch(Exception ex) 
     { 
      // 
     } 
    } 

Ihr Testgerät kann dann behaupten, dass keine Ausnahme ausgelöst wird. Nicht ideal, aber wenn Bedürfnisse müssen ...