2016-01-03 1 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'); 
} 

Если бы не функция Structure в PHPStorm и документация из 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. –