symfony 功能测试的 500 状态代码
500 status code for symfony functional test
我正在进行测试,看看某条路线是否有效。 page/route 位于 http://localhost/login,当我在浏览器中访问它时,它工作正常,我已经在没有 cookie 的情况下进行了测试,并且我的缓存已清除。
但是,当我在 phpunit 中测试它时 LoginControllerTest
class 我收到了 500 状态代码内部服务器错误。
<?php
namespace Tests\AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class LoginControllerTest extends WebTestCase
{
public function testLoginPage()
{
$client = static::createClient();
$crawler = $client->request('GET', '/login');
// var_dump($client->getRequest()->getContent()); // Is empty
// 200 => 'OK'
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
// ...
因此 运行 phpunit
失败:
Failed asserting that 500 matches expected 200.
这里是 security.yml
案例,对理解问题有帮助。
# app/config/security.yml
security:
providers:
db_provider:
entity:
class: AppBundle:Users
property: Username
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]
firewalls:
secured_area:
pattern: ^/
anonymous: ~
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
default:
pattern: ^/manage
guard:
authenticators:
- app.token_authenticator
access_control:
- { path: ^/manage, roles: ROLE_USER }
路线已定义且有效(如预期)。
// ...
class LoginController extends Controller
{
/**
* @Route("/login", name="LoginForm")
*/
public function loginFormAction(Request $request)
{
// ...
500 错误可能是由您的情况引起的。
在这种情况下您可以做的是转储响应的内容并检查 Symfony 调试消息。
我通常使用这样的代码片段直接在终端中快速检查此类错误:
if (!$response->isSuccessful()) {
$block = $crawler->filter('div.text_exception > h1');
if ($block->count()) {
$error = $block->text();
}
}
其中 div.text_exception > h1
是从 Symfony2 调试页面到消息本身的 xpath
然后打印 $error
这个问题有点老了,但是可以(至少从 symfony 5.2 开始)
$client->catchExceptions(false);
并且您将直接在 phpunit 输出中获得堆栈跟踪
我正在进行测试,看看某条路线是否有效。 page/route 位于 http://localhost/login,当我在浏览器中访问它时,它工作正常,我已经在没有 cookie 的情况下进行了测试,并且我的缓存已清除。
但是,当我在 phpunit 中测试它时 LoginControllerTest
class 我收到了 500 状态代码内部服务器错误。
<?php
namespace Tests\AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class LoginControllerTest extends WebTestCase
{
public function testLoginPage()
{
$client = static::createClient();
$crawler = $client->request('GET', '/login');
// var_dump($client->getRequest()->getContent()); // Is empty
// 200 => 'OK'
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
// ...
因此 运行 phpunit
失败:
Failed asserting that 500 matches expected 200.
这里是 security.yml
案例,对理解问题有帮助。
# app/config/security.yml
security:
providers:
db_provider:
entity:
class: AppBundle:Users
property: Username
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]
firewalls:
secured_area:
pattern: ^/
anonymous: ~
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
default:
pattern: ^/manage
guard:
authenticators:
- app.token_authenticator
access_control:
- { path: ^/manage, roles: ROLE_USER }
路线已定义且有效(如预期)。
// ...
class LoginController extends Controller
{
/**
* @Route("/login", name="LoginForm")
*/
public function loginFormAction(Request $request)
{
// ...
500 错误可能是由您的情况引起的。
在这种情况下您可以做的是转储响应的内容并检查 Symfony 调试消息。
我通常使用这样的代码片段直接在终端中快速检查此类错误:
if (!$response->isSuccessful()) {
$block = $crawler->filter('div.text_exception > h1');
if ($block->count()) {
$error = $block->text();
}
}
其中 div.text_exception > h1
是从 Symfony2 调试页面到消息本身的 xpath
然后打印 $error
这个问题有点老了,但是可以(至少从 symfony 5.2 开始)
$client->catchExceptions(false);
并且您将直接在 phpunit 输出中获得堆栈跟踪