2016-09-26 5 views
5

Я пытаюсь запустить некоторые базовые модульные тесты для моего приложения Laravel с помощью PHPUnit.Laravel: PHPUnit вызывает 404s для всего

Однако все HTTP-запросы возвращают 404 не найденный код состояния HTTP, поэтому мы терпим неудачу при первом препятствии.

После траления в Интернете, я нашел информацию о том, как исправить это, но до сих пор ни один из них на самом деле не работает:

  • Проверка я ссылка именованного маршрута правильно.
  • Проверка того, что этот маршрут имеет метод контроллера.
  • Убедитесь в том, что он работает в браузере.
  • Я гарантировал, что мое приложение URL правильно установить во всех нужных местах: TestCase::$baseUrl, Config->app->url ... Ее набор для http://localhost/myappfolder
  • Я пробовал различные методы из моей методы испытаний блока, чтобы получить ответ HTTP объект. До сих пор все приводили к 404: $this->route(), $this->action(), $this->call().
  • Я попытался удалить все ссылки на средство защиты маршрутов от моих контроллеров. Я считаю, что он отключен при выполнении модульных тестов, но я сделал это, когда я вытаскиваю свои пресловутые волосы, пытаясь диагностировать эту проблему. Нет эффекта.
  • Файл корней моего приложения имеет несколько PHP require s, которые содержат файлы меньшего маршрута. Тейлор Отуэлл ранее сказал, что файл маршрутов, подобный этому, но содержащий require_once, может вызвать эти ошибки 404. Он предлагает перейти на require. Некоторые разработчики сообщают, что это исправление для них, но у меня только что было require. В любом случае, я также пытался перемещать маршруты обратно в файл основных маршрутов, но это тоже не сработало.

Исследование было обычно необычным:

  • Если я редактирую метод route() в Illuminate\Foundation\Testing\Concerns распечатать URL он генерирует, это на самом деле вполне сформировано: http://localhost/myprojectfolder/route-url-text. Посещение этой страницы в браузере отлично работает. Посещение его с помощью cURL также работает. Запустив $this->call() по URL-адресу, который был сгенерирован, а затем запущен PHPUnit, он снова отображает 404. Так что его просто PHPUnit делает что-то странное.

Вот код, я использую в единичном тестовом сценарии:

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

Его любит есть что-то ступая и явно бросающие 404 ... было бы очень признателен, если кто-то может пролить свет на этом.

+0

Это будет показаться странным, но что произойдет, если вы сразу вызовете другой маршрут? Вы получаете 200? У меня была аналогичная проблема в прошлом, но так и не нашли решение – Aron

+0

Это странно ... но я ценю предложение. Я поставил несколько запросов подряд. Все еще получите 404. – kohloth

+0

Ах, простите, я не могу больше помочь. Возможно, стоит опубликовать эту проблему на форуме laracasts – Aron

ответ

1

Проблема решена. У меня было это внутри app/Providers/AppServiceProvider.php. Что-то добавить в коллективное руководство по устранению неполадок phpunit!

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

Я изменил это:

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

И поставил этот INSITE phpunit.xml

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

Laravel5.5 (поставщик/Laravel/рамки/SRC/Осветите/Foundation/Тестирование/Озабоченность/ДелаетHttpRequests.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); 
} 

Очевидно, что Laravel не отправить запрос на удаленный:

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

Вы должны использовать сотрудничество обман.