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 输出中获得堆栈跟踪