2012-11-26 8 views
6

Jestem nowy w środowisku testowym PHPUnit.Jak symulować przesyłanie plików w linii poleceń php:

jak wiemy, że move_uploaded_file() funkcja PHP nie będzie działać, dopóki plik jest wysyłany za pośrednictwem metody HTTP POST

Więc pytanie jest jak symulować to w wierszu poleceń PHP

Uwaga: przy użyciu selenu my może symulować webform .. ale potrzebuję innej alternatywy.

Odpowiedz

7

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.

0

Można zrobić przesyłanie plików z wiersza poleceń z cURL:

curl --form [email protected] http://localhost/upload.php 

z input-name jest nazwa pola wejściowego w formacie HTML normalnie używane filename będącego ścieżkę i nazwę pliku, który ma zostać przesłany - pamiętaj, aby umieścić je w cudzysłowie lub uciec od specjalnego charakteru, jeśli zawierają niektóre.

Jednak to oczywiście nadal wymaga uruchomienia skryptu z serwera WWW i najwyraźniej nie jest to, co chcesz, więc zobacz How can I write tests for file upload in PHP? sposoby testowania przesyłania plików za pomocą PHPUnit.

2

Jeśli chcesz używać PHPUnit do testowania przesyłania plików bez wyszydzania rzeczywistego testu move_uploaded_file, możesz użyć przypadków testowych .phpt, które PHPUnit może wykonać, więc zasymuluj żądanie WWW.

Zasadniczo utworzyć plik .phpt, który wygląda tak:

Samodzielny przykład: uploadTest.phpt

--TEST-- 
Example test emulating a file upload 
--POST_RAW-- 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfywL8UCjFtqUBTQn 

------WebKitFormBoundaryfywL8UCjFtqUBTQn 
Content-Disposition: form-data; name="file"; filename="example.txt" 
Content-Type: text/plain 

Qafoo provides quality assurance support and consulting 

------WebKitFormBoundaryfywL8UCjFtqUBTQn 
Content-Disposition: form-data; name="submit" 

Upload 
------WebKitFormBoundaryfywL8UCjFtqUBTQn-- 
--FILE-- 
<?php 

var_dump(is_uploaded_file($_FILES['file']['tmp_name'])); 

?> 
--EXPECT-- 
bool(true) 

prowadzony przy użyciu phpunit uploadTest.phpt


Dla pełnego wyjaśnienia sprawdzeniu blogu opisującym szczegóły:

http://qafoo.com/blog/013_testing_file_uploads_with_php.html

również: There is working sample code over at github


więcej komunikatów przykład prawdziwy świat:

--TEST-- 
Example test emulating a file upload 
--POST_RAW-- 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfywL8UCjFtqUBTQn 

------WebKitFormBoundaryfywL8UCjFtqUBTQn 
Content-Disposition: form-data; name="file"; filename="example.txt" 
Content-Type: text/plain 

Qafoo provides quality assurance support and consulting 

------WebKitFormBoundaryfywL8UCjFtqUBTQn 
Content-Disposition: form-data; name="submit" 

Upload 
------WebKitFormBoundaryfywL8UCjFtqUBTQn-- 
--FILE-- 
<?php 
require __DIR__ . '/UploadExample.php'; 

$upload = new UploadExample('/tmp'); 
$upload->handle('file'); 

var_dump(file_exists('/tmp/example.txt')); 
?> 
--EXPECT-- 
bool(true) 
+0

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. –

+0

@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

+0

PHPUnit 3.7.9 pomija test. Czy istnieje sposób na określenie, dlaczego jest pomijany? –

3

To gdzie PHP Testing Framework (PHPT) przychodzi Jest on instalowany z gruszką i pozwala. przesyłaj żądania HTTP, operacje we/wy, przesyłanie plików itp. do skryptu PHP, pisząc plik .phpt i wykonuj go za pomocą run-phpt lub pear run-tests <file.phpt>. Możesz także run them with PHPUnit używać PhptTestCase i PhptTestSuite.

Aby zasymulować przesyłanie pliku, należy użyć --POST_RAW-- section z tymi samymi danymi, które wysyła przeglądarka. Jest to przykład ze strony PHP qat:

Ważne: Niestety, przykład na ich miejscu nie bez żadnego wyjaśnienia.

is_uploaded_file.phpt

--TEST-- 
is_uploaded_file() function 
--CREDITS-- 
Dave Kelsey <[email protected]> 
--SKIPIF-- 
<?php if (php_sapi_name()=='cli') die('skip'); ?> 
--POST_RAW-- 
Content-type: multipart/form-data, boundary=AaB03x 

--AaB03x 
content-disposition: form-data; name="field1" 

Joe Blow 
--AaB03x 
content-disposition: form-data; name="pics"; filename="file1.txt" 
Content-Type: text/plain 

abcdef123456789 
--AaB03x-- 
--FILE-- 
<?php 
// uploaded file 
var_dump(is_uploaded_file($_FILES['pics']['tmp_name'])); 

// not an uploaded file 
var_dump(is_uploaded_file($_FILES['pics']['name'])); 

// not an uploaded file 
var_dump(is_uploaded_file('random_filename.txt')); 

// not an uploaded file 
var_dump(is_uploaded_file('__FILE__')); 

// Error cases 
var_dump(is_uploaded_file()); 
var_dump(is_uploaded_file('a', 'b')); 

?> 
--EXPECTF-- 
bool(true) 
bool(false) 
bool(false) 
bool(false) 

Warning: is_uploaded_file() expects exactly 1 parameter, 0 given in %s on line %d 
NULL 

Warning: is_uploaded_file() expects exactly 1 parameter, 2 given in %s on line %d 
NULL 

Running

pear run-tests --cgi=PHPCGI is_uploaded_file.phpt 

Manuel Pichler napisał aż przykład w blog post, ale nie jest on tak dobrze.