我正在进行测试,看看某条路线是否正常工作。页面/路由位于http://localhost/login,当我在浏览器中访问它时工作正常,我已经测试了这个没有cookie并清除了我的缓存。
但是,只要我在phpunit LoginControllerTest
类中测试它,我就会收到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)
{
// ...
答案 0 :(得分:3)
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
答案 1 :(得分:1)
这个问题有点老了,但有可能(至少从 symfony 5.2 开始)
$client->catchExceptions(false);
你会直接在phpunit输出中得到堆栈跟踪