2016-09-26 12 views
5

Próbuję uruchomić kilka podstawowych testów jednostkowych dla mojej aplikacji Laravel z PHPUnit.Laravel: PHPUnit powoduje 404 dla wszystkiego

Jednak wszystkie żądania HTTP zwracają kod statusu HTTP nie odnaleziony, więc nie udaje nam się to z pierwszej przeszkody.

Po trałowania w internecie, znalazłem informację o tym, jak temu zaradzić, ale do tej pory żaden z nich faktycznie działa:

  • Sprawdzanie Mam odwołuje trasę nazwaną poprawnie.
  • Sprawdzanie, czy ta trasa ma metodę kontrolera.
  • Sprawdzanie, czy działa w przeglądarce.
  • mam zapewnione, że moja aplikacja url jest ustawiona prawidłowo we wszystkich właściwych miejscach: TestCase::$baseUrl, Config->app->url ... Jej zestaw do http://localhost/myappfolder
  • Próbowałem różnych metod od wewnątrz moich metod badań jednostkowych, aby uzyskać odpowiedź HTTP obiekt. Do tej pory wszystkie wyniki są w 404: , $this->action(), .
  • Próbowałem usunąć wszystkie odwołania do oprogramowania zabezpieczającego trasy z moich kontrolerów. Uważam, że jest wyłączony podczas testów jednostkowych, ale zrobiłem to, ponieważ wyciągam moje przysłowiowe włosy, próbując zdiagnozować ten problem. Bez efektu.
  • Plik główny mojej aplikacji ma kilka PHP require s, które zawierają mniejsze pliki trasy. Taylor Otwell powiedział wcześniej, że taki plik tras, ale zawierający require_once, może spowodować te 404 błędy. Sugeruje zmianę na require. Niektórzy programiści zgłaszają, że to naprawia je dla nich, ale moje zostały właśnie require cały czas. Próbowałem również przenieść trasy z powrotem do głównego pliku tras, ale to też nie zadziałało.

Badania były zazwyczaj nietypowe:

  • Gdybym edytować metodę route() ciągu Illuminate\Foundation\Testing\Concerns wydrukować URL to generuje, jest w rzeczywistości doskonale uformowane: http://localhost/myprojectfolder/route-url-text. Odwiedzenie tej strony w przeglądarce działa poprawnie. Zwiedzanie go przy pomocy cURL również działa. Uruchamianie $this->call() na wygenerowanym adresie URL, a następnie uruchomienie PHPUnit ponownie pokazuje 404. Więc to tylko PHPUnit robi coś dziwnego.

Oto kod używam w scenariuszu testowym jednostka:

public function testThis() 
{ 
    $response = $this->route('GET', 'myRouteName', [ 
     'myParam' => 5 
    ]); 
    dd($response->status()); // 404 - always! 
} 

jej jak coś jest nasilenie i wyraźnie rzuca 404 ... Czy naprawdę wdzięczny jeśli ktoś mógłby rzucić światło na to.

+0

To może wydawać się dziwne, ale co się stanie, jeśli później zadzwonisz na inną trasę? Czy masz 200? Miałem podobny problem w przeszłości, ale nigdy nie znalazłem rozwiązania. – Aron

+0

To wydaje się dziwne ... ale doceniam sugestię. Złożyłem kilka wniosków kolejno. Nadal dostaję 404. – kohloth

+0

Ach, przepraszam, nie mogę być bardziej pomocny. Warto również opublikować ten problem na forum laracast – Aron

Odpowiedz

1

Problem rozwiązany. Miałem to wewnątrz app/Providers/AppServiceProvider.php. Coś do dodania do zbiorczego podręcznika rozwiązywania problemów z phpunit!

public function boot() 
{ 
    URL::forceRootUrl(Config::get('app.url')); 
} 

Zmieniłem to:

public function boot() 
{ 
    if (!defined('PHPUNIT_RUNNING')) { 
     URL::forceRootUrl(Config::get('app.url')); 
    } 
} 

i umieścić ten insite phpunit.xml

<php> 
    <const name="PHPUNIT_RUNNING" value="true"/> 
</php> 
1

Laravel5.5 (sprzedawca/laravel/framework/src/Illuminate/Fundacja/Testowanie/Dotyczy/MakesHttpRequests.php)

public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) 
{ 
    $kernel = $this->app->make(HttpKernel::class); 
    $files = array_merge($files, $this->extractFilesFromDataArray($parameters)); 
    $symfonyRequest = SymfonyRequest::create(
     $this->prepareUrlForRequest($uri), $method, $parameters, 
     $cookies, $files, array_replace($this->serverVariables, $server), $content 
    ); 
    $response = $kernel->handle(
     $request = Request::createFromBase($symfonyRequest) 
    ); 
    if ($this->followRedirects) { 
     $response = $this->followRedirects($response); 
    } 
    $kernel->terminate($request, $response); 

    return $this->createTestResponse($response); 
} 

Jest oczywiste, że laravel nie wysłał prośbę do pilota:

$response = $kernel->handle(
    $request = Request::createFromBase($symfonyRequest) 
); 

Należy użyć współpracy oszustwo.

Powiązane problemy