2016-01-03 79 views
3

考慮以下幾點:在laravel調用命名路由測試

<?php 

use Illuminate\Foundation\Testing\WithoutMiddleware; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class HomeRouteTest extends TestCase 
{ 
    public function testVisitTheHomePage() 
    { 
     $response = $this->call('GET', '/'); 
     $this->assertEquals(200, $response->status()); 

    } 

    public function testVisitTheAboutPage() 
    { 
     $response = $this->call('GET', '/about'); 
     $this->assertEquals(200, $response->status()); 
    } 
} 

有沒有去,不是我所看到的記錄>>,做這樣的事情:

$response = $this->call('GET', 'home.about'); 
$this->assertEquals(200, $response->status()); 

或...這是你如何做到的?

我得到的錯誤是:

[email protected]:/var/www$ phpunit 
PHPUnit 4.8.21 by Sebastian Bergmann and contributors. 

FF 

Time: 3.41 seconds, Memory: 14.25Mb 

There were 2 failures: 

1) HomeRouteTest::testVisitTheHomePage 
Failed asserting that 404 matches expected 200. 

/var/www/tests/HomeRouteTest.php:12 

2) HomeRouteTest::testVisitTheAboutPage 
Failed asserting that 404 matches expected 200. 

/var/www/tests/HomeRouteTest.php:19 

FAILURES! 
Tests: 2, Assertions: 2, Failures: 2. 

回答

3

這是一個很遲了迴應,但我認爲你要尋找的是:

$this->route('GET', 'home.about'); 
$this->assertResponseOk(); // Checks that response status was 200 

對於參數的路線,你可以這樣做:

$this->route('GET', 'users.show', ['id' => 3]); // (goes to '/users/3') 

我需要這測試我正在使用的一些可怕的路線,看起來像這樣:

Route::resource(
    '/accounts/{account_id}/users', 
    '[email protected]', 
    [ 
     'parameters' => ['account_id'], 
     'names'  => [ 
      'create' => 'users.create', 
      'destroy' => 'users.destroy', 
      'edit' => 'users.edit', 
      'show ' => 'users.show', 
      'store' => 'users.store', 
      'update' => 'users.update', 
     ] 
    ] 
); 

爲了確保我的路線和redir學分去正確的網頁我這樣做:(?我們都會複製 - 粘貼錯誤,右)

/** 
* @test 
*/ 
public function users_index_route_loads_correct_page() 
{ 
    $account = Account::first(); 

    $response = $this->route('get', 'users.index', ['account_id' => $account->id]); 
    $this->assertResponseOk() 
     ->seePageIs('/accounts/' . $account->id . '/users'); 
} 

爲了確保我用的是右視圖文件,我這樣做:

/** 
* @test 
*/ 
public function users_index_route_uses_expected_view() 
{ 
    $account = Account::first(); 

    $response = $this->route('get', 'users.index', ['account_id' => $account->id]); 

    $view = $response->original; // returns View instance 
    $view_name = $view->getName(); 

    $this->assertEquals($view_name, 'users.index'); 
} 

如果不是針對PHPStorm中的Structure特性和Laravel 4.2的文檔,我偶然發現,我不認爲我會想出如何測試這些路由。我希望這節省了一些時間。

+1

這不再適用於Laravel 5.4 - 調用未定義的方法route() – Julian

-1

說實話,我看不出有任何理由來測試名稱的路線。命名路由相當容易在應用程序內部使用,您應該測試具體的url而不是命名路由以確保使用正確的url。

如果你需要真正測試已命名的路線,我會創造的輔助功能與簡單的數組:

protected function getNamedRoute($name) 
{ 
    $routes = [ 
     'home.about' => '/about', 
    ]; 

    return $routes[$name]; 
} 

,然後在您的測試:

public function testVisitTheHomePage() 
{ 
    $response = $this->call('GET', $this->getNamedRoute('home.about')); 
    $this->assertEquals(200, $response->status()); 
} 

的第二件事情是,你可以使這些測試更清潔一些,你不需要使用:

$response = $this->call('GET', '/'); 
$this->assertEquals(200, $response->status()); 

你可以使用:

$this->visit('/')->seeStatusCode(200); 

對我來說,它更清晰,你可以編寫更少的代碼來實現。

+0

我真的不知道你的測試如何測試任何東西。我已經在我的系統中定義了路由,您似乎正在測試路由名稱存在的事實... – TheWebs

+0

測試命名路由的原因是,當URL由於重構而更改時,測試繼續工作而不被更改(只要路線的名稱不變)。 – Julian

+0

@Julian但是如果你爲第三方和開發者之一創建了API,會在沒有實際通知第三方的情況下更改路由URL?測試會通過(因爲他們會使用命名的路由),但是你的應用程序不能用於第三方,因爲在他們的應用程序中他們不使用明顯命名的路線,而是使用url。 –