Po prostu musisz sprawić, by twój kod był bardziej sprawdzalny. Podziel go, aby przetestować prosty akt przesyłania pliku przez HTTP oddzielnie od reszty kodu. Podstawowym zastosowaniem move_uploaded_file
jest umieszczenie dodatkowego ogranicznika bezpieczeństwa, więc nie można oszukać przeniesienia innego pliku, po prostu upewnia się, że plik został przesłany w tym samym żądaniu, a następnie przenosi go. Możesz po prostu przenieść plik również za pomocą rename
. W związku z tym należy przerwać działanie aplikacji, aby uzyskać jeden obiekt Request
, który reprezentuje i enkapsuluje bieżące żądanie HTTP, w tym sprawdzanie przesłanych plików przy użyciu is_uploaded_file
. Po zatwierdzeniu możesz użyć rename
zamiast move_uploaded_file
. W twoich testach możesz następnie kpić z obiektu Request
i przetestować swój drugi kod.
Można też po prostu zrobić move_uploaded_file
mockable, na przykład tak:
class Foo {
public function do() {
...
$this->move_uploaded_file($from, $to);
...
}
protected function move_uploaded_file($from, $to) {
return move_uploaded_file($from, $to);
}
}
w badaniach można rozszerzyć/Mock klasy i zastąpić Foo::move_uploaded_file
zawsze return true
, na przykład.
Czy ten przykład działa dla Ciebie? Nie mogę nawet pobrać prostego przykładu 'POST_RAW' z qa.php.net i nie mam pojęcia, co to jest awaria. Używam PHP 5.3.10-1 na Xubuntu. –
@DavidHarkness Edytowałem pytanie z samodzielnym przykładem, który działa dobrze dla mnie. 5.3 i 5.4 Ubuntu przy użyciu PHPUnit 3.6 i 3.7. – edorian
PHPUnit 3.7.9 pomija test. Czy istnieje sposób na określenie, dlaczego jest pomijany? –