2012-08-23 13 views
11

Rozważmy następujący scenariusz (to nie jest kod produkcji):PHPUnit: Jak wyśmiać ten system plików?

class MyClass { 
    public function myMethod() { 
     // create a directory 
     $path = sys_get_temp_dir() . '/' . md5(rand()); 
     if(!mkdir($path)) { 
      throw new Exception("mkdir() failed."); 
     } 

     // create a file in that folder 
     $myFile = fopen("$path/myFile.txt", "w"); 
     if(!$myFile) { 
      throw new Exception("Cannot open file handle."); 
     } 
    } 
} 

Prawo, więc w czym problem? pokrycie kodu informuje, że linia ta nie jest objęta:

throw new Exception("Cannot open file handle."); 

Które jest poprawne, ale ponieważ tworzę folder powyżej logicznie wydaje się niemożliwe dla fopen() na niepowodzenie (z wyjątkiem być może w skrajnych przypadkach, jak na dysku 100%).

Mogę zignorować kod z zasięgu kodu, ale to rodzaj oszustwa. Czy istnieje sposób, w jaki mogę sfałszować system plików, aby mógł rozpoznać myFile.txt i wyśmiać system plików, nie mogąc utworzyć pliku?

Odpowiedz

9

vfsStream jest stream wrapper na virtual filesystem, które są użyteczne w testach jednostkowych MOCK rzeczywistego plików. Możesz zainstalować go od composer.

Więcej informacji pod adresem:

https://github.com/mikey179/vfsStream

https://phpunit.de/manual/current/en/test-doubles.html

+0

Chcę, aby mkdir() przepuścił i fopen() zawiodł z vfs, ale jak mam to ustawić bez dwóch osobnych funkcji? –

+0

Zaznacz "Prześmiewanie systemu plików", zaczynając od przykładów '10.15' w powyższym linku' phpunit.de'. Zaletą korzystania z vfs jest brak rzeczywistych zależności od oryginalnego systemu plików. – raidenace

1

Tak!

Należy wprowadzić pełną ścieżkę jakoś, i nie nazywaj sys_get_temp_dir() w prawo w tej metodzie.

Każda nieistniejąca ścieżka powinna powodować problem. Nie potrzebujesz do tego VFS.

ALE dostaniesz e_notice (lub ostrzeżenie może?), Zanim zostanie wywołany wyjątek. Powinieneś więc najpierw sprawdzić is_writable i wyrzucić wyjątek, jeśli zwróci false.

+0

W tej sytuacji ścieżka podstawowa jest nieistotna, niezależnie od tego, czy ją wstrzyknę, czy nie. –

+1

Jest to istotne. Najłatwiejszym sposobem na niepowodzenie jest zmiana ścieżki bazowej. Z 'sys_get_temp_dir' nie możesz nigdy używać VSF, ponieważ ta ścieżka bazowa zawsze będzie prawdziwą ścieżką. – Evert

2

Można również podzielić funkcję na dwie metody, jedną do utworzenia ścieżki, a drugą do jej użycia. Następnie można wykonać indywidualne testy, aby zapewnić utworzenie ścieżki. Drugi zestaw testów może sprawdzić i przechwycić wyjątek przy próbie użycia niewłaściwej ścieżki.

Powiązane problemy