2017-05-18 1 views
0

Ich versuche eine Ausnahme in meinem Code zu testen.File_get_contents wird nicht als falsch ausgewertet, wenn die Datei nicht existiert

public function testGetFileThrowsException(){ 
    $this->expectException(FileNotFoundException::class); 
    $file = "db.json"; 
    $this->review->getData($file); 
} 

Die Datei "db.json" existiert nicht. Mein Ziel ist es, dass die Datei getData() die FileNotFoundException auslöst. Hier ist das getData() Code:

public function getData($path){ 

    if(file_get_contents($path) === false){ 
     throw new FileNotFoundException; 
    } 
    return $file; 
} 

Das Problem ist, dass statt auf False zu bewerten und die Ausnahme werfen, die file_get_contents kehrt funktionieren:

1) CompanyReviewTest::testGetFileThrowsException 
file_get_contents(db.json): failed to open stream: No such file or directory 

So ist der Test nicht erfolgreich ausgeführt. Irgendwelche Ideen, warum passiert das?

+0

___ Nur ein kleiner Punkt: ___ '$ datei' existiert nicht in dieser Methode ???? Aber es wird, wenn Sie es als 'if ($ file = file_get_contents ($ path) === false) {' – RiggsFolly

+0

1) Während des Debuggens bitte denken Sie daran, Fehlerberichte einzuschalten. 2) Wenn die Fehlerberichterstattung aktiviert ist, überprüfen Sie bitte das Fehlerprotokoll. – RiggsFolly

+0

Danke für den Tipp über $ file. Leider ist es mein Ziel zu testen, ob die Ausnahme ausgelöst wird, wenn der $ Pfad nicht existiert. –

Antwort

1

file_get_contents() erzeugt ein E_WARNING Ebene Fehler (der Stream konnte nicht geöffnet werden), den Sie unterdrücken möchten, da Sie ihn bereits mit Ihrer Ausnahmeklasse behandeln.

können Sie diese Warnung unterdrücken, indem PHP's error control operator@ vor file_get_contents() Hinzufügen Beispiel:

<?php 

$path = 'test.php'; 
if (@file_get_contents($path) === false) { 
    echo 'false'; 
    die(); 
} 

echo 'true'; 

?> 

Die obige Störechos, ohne den @ Operator gibt es sowohl die E_WARNING und das Echo falsch. Es kann der Fall sein, dass der Warnfehler Ihre Wurffunktion beeinträchtigt, aber ohne den Code dafür zu sehen, ist es schwer zu sagen.

+0

Aber verwenden Sie den' @ 'Fehler-Unterdrücker ___sehr sparsam___ – RiggsFolly

0

Sie haben 2-Lösung der Arme ist der Fehler, wie die

public function getData($path){ 

    if(@file_get_contents($path) === false){ 
     throw new FileNotFoundException; 
    } 
    return $file; 
} 

Oder schauen Sie vielleicht zu verbergen, wenn die Datei vorhanden ist (bessere Lösung ich denke)

public function getData($path){ 

if(file_exists($path) === false){ 
    throw new FileNotFoundException; 
} 
return $file; 
} 
Verwandte Themen