2016-07-29 18 views
0

Ich lerne Tests und versuche eine Funktion mit "Early Returns" zu testen. Die Funktion beim Erfolg setzt eine Eigenschaft in einer anderen Klasse und bei einem Fehler wird einfach zurückgegeben, sodass sie in beiden Fällen void zurückgibt.Testen gegen Early Returns (defensive Programmierung)

class Test 
{ 
    private $fileHandler; 
    private $config; 

    public __constructor($fileHandler, $config) 
    { 
     $this->fileHandler = $fileHandler; 
     $this->config = $config; 
    } 

    public function example($filePath) 
    { 
     $exists = $this->fileHandler->exists($filePath); 

     if ($exists === false) { 
      return; 
     } 

     $this->config->set($filePath); 
    } 
} 

In diesem Beispiel ich ich glaube, das mit zwei Unit-Tests testen kann und durch die fileHandler Klasse spöttisch.

Bei einem Fehler (frühzeitige Rückgabe) sollte die Methode $configset() nicht aufgerufen werden, während für einen Erfolg die Methode aufgerufen werden sollte.

Dieser Test besteht jedoch, wenn ich versuche, never() zu once() zu ändern, die mich denken lassen, dass der gesamte Test falsch ist.

/** test */ 
public function config_is_not_set_with_missing_file() 
{ 
    $fileHandlerMock = $this->getMockBuilder(fileHandler::class)->getMock; 
    $fileHandlerMock->method('exists') 
     ->willReturn('false'); 
    $configMock = $this->getMockBuilder(config::class)->getMock; 

    $test = new Test($fileHandlerMock, $configMock); 
    $test->example('fake file path'); 

    $configMock->expects($this->never()) 
     ->method('set'); 
} 
+0

nicht sicher, ob das der Grund ist, aber Sie sollten den Schein konfigurieren, bevor Sie den '$ test-> example()' Satz ausführen – gontrollez

+0

Vorsicht! ''falsch'! == falsch '! Ihre verspottete Funktion gibt eine Zeichenfolge mit dem Inhalt "false" zurück, nicht mit einem booleschen Wert * false *. – helmbert

Antwort

1

Ihr Dateihandlerspott gibt die Zeichenfolge 'false' zurück, die !== lautet, an false. Ändern Sie das zu false und Tets::example sollte früh zurückkehren.

1

Sie sind nicht die $configMock an der Test Konstruktor, so dass es nicht benutzt wird.

Sie haben recht, wenn der Test beide mit once und never Erwartungen erfüllt, funktioniert der Test nicht wie erwartet und erfordert eine Überprüfung.

+0

danke, es war ein Tippfehler, ich habe die Frage aktualisiert – myol

+0

versuchen, was ich in meinem Kommentar angegeben: Konfigurieren Sie den Mock vor der Ausführung der 'Beispiel' Methode – gontrollez