2017-03-17 89 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:單元測試Route :: group,前綴爲

但是,我似乎無法讓我的路由測試不會因爲我添加組和控制器而失敗。

這是我的routes/web.php文件:

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

這裏是我的tests/Unit/ExampleTest.php

<?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(); 
    } 
} 

通過如此基本的設置,當我運行我的測試中,我得到這樣的迴應:Error: Call to undefined method Illuminate\Http\Response::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()方法代碼,但是,如果這不是它的工作方式,那麼只要我能得到它的工作,我很好。預先感謝您的幫助和見解!

編輯

%的評論,我刪除並且使用命令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工匠make:controller ProductController --resource'。 'Route :: resource()'需要的控制器方法中缺少了幾個函數。 – Ohgodwhy

回答

1

嘗試php artisan route:list讓我懷疑的路由名稱路由 的名字是不是products(也許是其products.indexapi.products.index),因此錯誤。

有三種方式來解決這個問題:與路線的正確名稱

  1. 更新$this->get(route('products'));由路由列表工匠命令顯示(例如$this->get(route('products.index'));
  2. 而不是使用route輔助功能,指的是直接路線,像這樣:$this->get('/api/products/index');
  3. 重命名自定義名稱的路線,像這樣:

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

然後使用$this->get(route('products.list'));

+0

我想避免將路由硬編碼到測試中,以防萬一未來路由發生變化,所以我嘗試了選項1和3,雖然他們都沒有在測試方法'$ this->中使用這些行,得到(路線( 'products.list')); $ this-> assertResponseOk();'(我得到了以前關於'assertResponseOk()'的錯誤未定義),我用它來處理上面列出的調整過的代碼。謝謝! – Michael

0

您可以編輯路線::組這樣的:

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