2017-03-17 11 views
0

私はLaravelを新しくしており、PluralsightのPlay by Play: Getting Started with Laravel 5 with Steven Maguireビデオに従っています。これはVagrantのlavarvel/laravelボックスのクリーンインストールです。 Laravelはバージョン5.4.15、PHPUnitはバージョン5.7.16です。Laravel:Unit test Route ::接頭辞付きグループ

しかし、グループとコントローラを追加すると、私のルートテストが失敗しないようには見えません。

は、ここに私のroutes/web.phpファイルです:

ここ
<?php 
Route::get('products', ['as' => 'products', function(){ 
    return App\Product::all(); 
}]); 

だ私のtests/Unit/ExampleTest.phpError: Call to undefined method Illuminate\Http\Response::assertResponseOk()

後:ちょうどこの基本的なセットアップ、私は私のテストを実行したとき、私はこの応答を取得して

<?php 

namespace Tests\Unit; 

use Tests\TestCase; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 
use Illuminate\Http\Response; 

class ExampleTest extends TestCase 
{ 
    /** 
    * A basic test example. 
    * 
    * @return void 
    */ 
    public function testBasicTest() 
    { 
     $this->assertTrue(true); 
    } 
    public function testProductsList(){ 
     $this->get(route('products')) 
      ->assertResponseOk(); 
    } 
} 

私はこれを読んで、このテストを再構成しました:

public function testProductsList(){ 
    $response = $this->get(route('products')); 
    $this->assertEquals(200, $response->status()); 
} 

この新しい構造が成功したので、私はビデオを進め、次にルートグループを追加しました。 routes\web.phpファイル内のルートグループは次のとおりです。

Route::group(['prefix' => 'api'], function(){ 
    Route::get('products', ['as' => 'products', function(){ 
     return App\Product::all(); 
    }]); 
}); 

これも成功します。問題はフローにRoute::resourceを導入すると始まります。テストは失敗し始めます。ここでは新しいroutes\web.phpファイルです:

Route::group(['prefix' => 'api'], function(){ 
    Route::resource('products', 'ProductController', ['only' => ['index', 'store', 'update']]); 
}); 

はここProductControllerクラスは、このファイルapp/Http/Controllers/ProductController.phpにあります:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

class ProductController extends Controller 
{ 
    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index() 
    { 
     // 
    } 

    /** 
    * Store a newly created resource in storage. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @return \Illuminate\Http\Response 
    */ 
    public function store(Request $request) 
    { 
     // 
    } 

    /** 
    * Update the specified resource in storage. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param int $id 
    * @return \Illuminate\Http\Response 
    */ 
    public function update(Request $request, $id) 
    { 
     // 
    } 
} 

私はこのコントローラを作成するためにphp artisan make:controller ProductControllerを使用しました。ここに私が受け取ったエラーは次のとおりです:InvalidArgumentException: Route [products] not defined.

調整済みtestProductsList()メソッドを元のコードに戻そうとしましたが、それでも動作しません。

これらのエラーをどのように回避できるかについての洞察はありますか?私はオリジナルのtestProductsList()メソッドコードを保つことを望んでいますが、それがもっとうまくいかない場合は、私が正常に動作する限り、問題ありません。あなたの助けと洞察力に感謝します!コメントパー

EDIT

、私は削除して、コマンドphp artisan make:controller ProductController --resourceを使用してProductControllerクラスを再作成。変更内容を反映するために、ファイルapp/Http/Controllers/ProductController.phpの上記の内容を編集しました。しかし、テストはまだ失敗しています。アレックスの答えを、私はまた、しかし、変更せずに、これにtestProductsList方法を変更しました:

public function testProductsList(){ 
    /* 
    * I tried just `products` for the route 
    * and still receive the error. 
    */ 
    $this->get(route('api.products')); 
    $this->assertResponseOk(); 
} 

他のアイデアを?

+2

あなたは 'ルートを使用するつもりなら::リソースは、()'は '使用する旧姓PHP製作者:コントローラProductController --resource'。 'Route :: resource()'が必要とするコントローラメソッドにはいくつかの機能がありません。 – Ohgodwhy

答えて

1

が、私はルートの名前は、したがって、エラー、products(おそらくそのproducts.indexまたはapi.products.index)でない疑いがあるルートの名前 を取得するためにphp artisan route:listを試してみてください参照してください。代わりにrouteヘルパー関数を使用してのルートリストの職人コマンドによって(例えば$this->get(route('products.index'));

  • を表示して、ルートの正しい名前で

    1. 更新$this->get(route('products'));

      は、これを解決するには、3つの方法があります直接そのようなルート参照:$this->get('/api/products/index');

    2. はそうのようなカスタム名を持つルートの名前を変更します。

      Route::resource('products', 'ProductController', 
          ['names' => ['index' => 'products.list', // etc...]]); 
      

    次にあなたがルートを編集することができ$this->get(route('products.list'));

  • +0

    将来的にルートが変更された場合に備えて、テストへのルートをハードコーディングしないようにしたいので、オプション1と3を試しましたが、どちらもテストメソッド '$ this-> get(route( 'products.list')); $ this-> assertResponseOk(); '(私はassertResponseOk()が定義されていないという以前のエラーを受け取りました)、私は上にリストした調整済みのコードで動作するようにしました。ありがとうございました! – Michael

    0

    を使用::このようなグループ:

    Route::group(['prefix' => 'api', 'as' => 'api.'], function(){ 
        Route::resource('products', 'ProductController', ['only' => ['index', 'store',  'update']]); 
    }); 
    
    関連する問題