2017-03-17 96 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']]); 
});