2016-08-01 12 views
-3

Ich habe zwei Methoden wie unten.Komponententest zum Sicherstellen einer Methode innerhalb einer Methode heißt nicht

public bool IsSuccess() 
{ 
    // Some logi 
} 

public bool ShouldSendLogic() 
{ 
    var status = IsSuccess(); 
    if(status) 
    { 
    SendInvoice(); 
    // do some operation 
    } 
return status; 
} 

Jetzt schreibe ich Integration/Unit Tests. Ich kann das ShouldSendLogic aufrufen, aber ich möchte sicherstellen, dass SendInvoice nicht aufgerufen wird, indem Sie den Erfolg als false festlegen. (Nur für den negativen Fall). Wie schreibe ich Testfall für dieses Szenario, bitte helfen Sie mir mit einem Code dafür.

+0

hat 'SendInvoice' jede Nebenwirkung verursachen, die man messen kann? –

+0

@SamIam: Ja, diese Logik sollte nicht ausgeführt werden, wenn der Status gemäß obiger Logik – Learner

+0

falsch ist, aber verursacht sie irgendwelche Nebenwirkungen? Was tut es? –

Antwort

-2

können Sie die ShouldSendLogic() ändern Status als Parameter bool ShouldSendLogic(bool status) zu akzeptieren. Auf diese Weise kann ShouldSendLogic auf positive und negative Fälle getestet werden.

Ein anderer Ansatz besteht darin, IsSuccess() Teil einer Schnittstelle zu haben und die Abhängigkeit der Klasse zu injizieren, die ShouldSendLogic() hat. Das IsSuccess() Ergebnis kann durch Mockup-Klassen in der Einheitentestumgebung geändert werden, und ShouldSendLogic() kann für verschiedene Statuswerte getestet werden.

class MyClass 
{ 

    ISomeInterface _interfaceObj; 

    public MyClass(ISomeInterface interfaceObj) 
    { 
     _interfaceObj = interfaceObj; 
    } 

    public bool ShouldSendLogic() 
    { 
     var status = _interfaceObj.IsSuccess(); 
     if (status) 
     { 
      SendInvoice(); 
      // do some operation 
     } 
     return status; 
    } 
} 

bearbeiten

Durch den Code zu trennen, die für den Erfolg eine Schnittstelle überprüft, können Sie jetzt ein „Schein“ Objekt in der Unit-Tests erstellen, wo Sie, was den Wert von IsSuccess entscheiden können () sollte sein.

z.B.

public class MockSuccessClass : ISomeInterface 
{ 
    public bool IsSuccess { return true; } 
} 

Und dann in Ihrem „Anordnen“ Ihr Gerät zu testen, können Sie eine Instanz der MockSuccessClass erstellen und an das SUT passieren.

Sie müssen Moq nicht verwenden, aber es würde Zeit sparen, wenn Sie lassen Moq für Sie Ihre Mock-Klassen erstellen.

Verwandte Themen