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 $config
set()
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');
}
nicht sicher, ob das der Grund ist, aber Sie sollten den Schein konfigurieren, bevor Sie den '$ test-> example()' Satz ausführen – gontrollez
Vorsicht! ''falsch'! == falsch '! Ihre verspottete Funktion gibt eine Zeichenfolge mit dem Inhalt "false" zurück, nicht mit einem booleschen Wert * false *. – helmbert