2014-04-24 7 views
7

mam ten dziwny problem, gdy nazywam parent::setUp() w mojej klasie TestCase dla testów jednostkowych klasa gdy uruchamiam PHPUnit to rzucać mi ten błąd:Nie można wysłać plik cookie sesji - headers already sent PHPUnit/laravel

1) MatchRequestRepositoryTest::test_find_requests_by_match_id ErrorException: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/project.dev/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:459)

Jaki może być problem? Dzięki za pomoc.

+2

proszę sprawdzić: http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php – DOZ

+0

Będziesz musiał dzielić zawartość twojego testu. Czy twoja aplikacja wykonuje jakąkolwiek bezpośrednią manipulację sesjami, za pośrednictwem natywnych wywołań funkcji 'session_' lub' Session :: '? – Andreas

+0

Prawdopodobny duplikat [Testuj nagłówki PHP z PHPunit] (http://stackoverflow.com/questions/9745080/test-php-headers-with-phpunit) –

Odpowiedz

19

Problem polega na tym, że masz trochę kodu, być może głęboko w używanym frameworku, który wywołuje session_start(). To z kolei chce wysłać plik cookie. Ale PHPUnit już zaczął zapisywać dane wyjściowe na standardowe wyjście.

Kluczem do realizacji tutaj jest to, że jest to tylko test jednostkowy, nikt nie dba o nagłówek. Więc po prostu pomiń komunikat o błędzie. A sposób, w jaki to robisz, bez zmieniania testowanego systemu, polega na wywołaniu session_start() w twoim własnym teście jednostki (albo przed parent::setUp() lub wewnątrz tej funkcji setUp). Użyj prefiksu @, aby wyłączyć błędy. na przykład

function setUp(){ 
    @session_start(); 
    parent::setUp(); 
    ... 
    } 
+2

Niestety, to rozwiązanie nadal będzie powodowało błąd w teście. Będzie produkować coś takiego: 'Wystąpił 1 błąd: 1) Nazwaklasy :: ClassTest Sesja już się rozpoczęła - ignorowanie session_start()' – w00tland

+1

@ w00tland '@' powinno zatrzymać wszelkie zgłaszane błędy lub ostrzeżenia . Czy masz "@" na linii, na które narzeka? Czy dodanie/usunięcie znaku '@ 'powoduje zmianę komunikatu o błędzie? (Jeśli nie możesz odebrać wiadomości, warto rozpocząć nowe pytanie, ponieważ chodziło o to, jak pozbyć się skargi "już wysłano nagłówek".) –

+2

Wiem, że powinno to zapobiec zgłaszaniu ostrzeżeń. Wiadomość, którą udostępniłem powyżej, jest wynikiem wyłączenia tej wiadomości. I tak, otrzymuję komunikat "Nie mogę wysłać sesji cookie - nagłówki już wysłane przez", jeśli usunę ten @. I mam dokładnie ten sam problem; Po prostu próbuję pozbyć się komunikatu "nagłówki już wysłane". – w00tland

11

Najlepszym sposobem, aby to zrobić w PHPUnit jest wysyłanie wyjście na stderr zamiast stdout jak wykazano przez this answer.

phpunit --stderr 
+0

Czy jest jakieś backfire przy użyciu tego? lub w ogóle nie ma problemu? dzięki – Carlos

+1

@ Carlos Wciąż nie znalazłem żadnego problemu z tym. –

+1

Działa jak wdzięk –

Powiązane problemy