在 laravel 测试中调用命名路由
Calling named routes in laravel tests
考虑以下几点:
<?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());
或者....你是这样做的吗?
我得到的错误是:
vagrant@scotchbox:/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.
老实说,我看不出有任何理由要测试名称路由。命名路由更易于在应用程序内部使用,您应该测试具体的 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);
对我来说,它更清晰易读,您可以编写更少的代码来实现同样的效果。
这是一个非常晚的回复,但我认为您正在寻找的是:
$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',
'AccountsController@users',
[
'parameters' => ['account_id'],
'names' => [
'create' => 'users.create',
'destroy' => 'users.destroy',
'edit' => 'users.edit',
'show ' => 'users.show',
'store' => 'users.store',
'update' => 'users.update',
]
]
);
为了确保我的路由和重定向转到正确的页面,我这样做了:
/**
* @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 中的结构特性和我偶然发现的 Laravel 4.2 的文档,我认为我永远不会想出如何测试这些路由。我希望这能为其他人节省一些时间。
据我所知,此解决方案适用于任何 Laravel 5 版本。特别是 Laravel 5.4+ 与此处提到的其他解决方案不同。
如果你的命名路由有参数,你可以这样做:
$response = $this->get(route('users.show', [
'user' => 3,
]));
$response->assertStatus(200);
如果您的命名路由没有参数,那么您可以这样做:
$response = $this->get(route('users.index'));
$response->assertStatus(200);
简洁明了。
考虑以下几点:
<?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());
或者....你是这样做的吗?
我得到的错误是:
vagrant@scotchbox:/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.
老实说,我看不出有任何理由要测试名称路由。命名路由更易于在应用程序内部使用,您应该测试具体的 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);
对我来说,它更清晰易读,您可以编写更少的代码来实现同样的效果。
这是一个非常晚的回复,但我认为您正在寻找的是:
$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',
'AccountsController@users',
[
'parameters' => ['account_id'],
'names' => [
'create' => 'users.create',
'destroy' => 'users.destroy',
'edit' => 'users.edit',
'show ' => 'users.show',
'store' => 'users.store',
'update' => 'users.update',
]
]
);
为了确保我的路由和重定向转到正确的页面,我这样做了:
/**
* @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 中的结构特性和我偶然发现的 Laravel 4.2 的文档,我认为我永远不会想出如何测试这些路由。我希望这能为其他人节省一些时间。
据我所知,此解决方案适用于任何 Laravel 5 版本。特别是 Laravel 5.4+ 与此处提到的其他解决方案不同。
如果你的命名路由有参数,你可以这样做:
$response = $this->get(route('users.show', [
'user' => 3,
]));
$response->assertStatus(200);
如果您的命名路由没有参数,那么您可以这样做:
$response = $this->get(route('users.index'));
$response->assertStatus(200);
简洁明了。