2016-09-26 7 views
5

PHPUnitでLaravelアプリケーションの基本単位テストを実行しようとしています。Laravel:すべてのPHPUnitが404を引き起こします

しかし、すべてのHTTPリクエストは404のHTTPステータスコードを返しません。したがって、最初のハードルで失敗しています。

インターネットをトロールした後、私はこの問題を解決する方法についての情報を発見したが、これらのこれまでのところどれも実際に動作しない:

  • は、私が正しい名前のルートを参照しましチェック。
  • このルートにコントローラメソッドがあることを確認してください。
  • ブラウザで動作することを確認します。私は、HTTPレスポンスを得るために、私のユニットテストメソッド内からさまざまな方法を試してみたTestCase::$baseUrlConfig->app->url ...そのセットhttp://localhost/myappfolder
  • に:私は自分のアプリケーションのURLがすべて正しい場所に正しく設定されていることを確実にしました
  • オブジェクト。これまでのところすべてが404:$this->route(),$this->action()$this->call()となりました。
  • 私はコントローラからルート保護ミドルウェアへの参照をすべて削除しようとしました。私は単体テストを実行しているときは無効になっていると信じていますが、私はこの問題を診断しようとしている私の目立つ髪の毛を引っ張っています。無効。
  • 私のアプリケーションのルーツファイルには、より小さなルートファイルを含む複数のPHP requireがあります。 Taylor Otwellはこれまでに、このようなルートファイルがrequire_onceを含むと、これらの404エラーを引き起こす可能性があると言いました。彼はrequireに変更することを提案しています。いくつかの開発者は、これで修正されたと報告していますが、私の場合はrequireとなっています。とにかくメインルートファイルにルートを戻してみましたが、これはどちらもうまくいきませんでした。

調査は、通常、珍しいされています

  • 私はそれが生成するURLをプリントアウトするIlluminate\Foundation\Testing\Concernsroute()メソッドを編集した場合、それは完全に形成され、実際にある:http://localhost/myprojectfolder/route-url-text。ブラウザでこのページを訪れても問題ありません。 cURLで訪問することもできます。生成されたURLに$this->call()を実行すると、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

ああ申し訳ありませんが、私はもっと助けになることはできません。この問題をlaracastフォーラムにも投稿する価値があります – Aron

答えて

1

問題を解決しました。私はこの内部にapp/Providers/AppServiceProvider.phpを持っていた。集合的なphpunitのトラブルシューティングガイドに何か追加してください!

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

そしてphpunit.xml

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

このINSITEを入れLaravel5.5(ベンダー/ laravel /フレームワーク/ SRC /照らしなさい/財団/テスト/:私はこれを変更した

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

Concerns/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); 
} 

laravelがリモートに要求を送信していないことは明らかである:

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

あなたが共同詐欺を使用する必要があります。

関連する問題