在功能测试中加载服务(Symfony4)

时间:2018-02-11 15:59:14

标签: dependency-injection functional-testing symfony4

我试图用PHPUnit测试用Symfony 4制作的控制器。 我使用https://github.com/lexik/LexikJWTAuthenticationBundle来管理JWT。

如果给出有效的JWT,该控制器应返回200,否则返回401/40。

401响应的第一部分很简单:我只是不发送任何令牌

<?php

namespace App\Tests\Controller;

Class GraphQLControllerTest extends \Symfony\Bundle\FrameworkBundle\Test\WebTestCase {

    function test_token(){

        $client = static::createClient();
        $client->request('GET', '/graphql');

        // Check 401 response
        $response = $client->getResponse();
        $this->assertSame(401, $response->getStatusCode());
        $this->assertSame('"Not authenticated"', $response->getContent());

    }
}

接下来的部分很棘手:如何在我的test_token方法中获取JWT编码器服务以生成一些令牌来测试200和403的响应?

如果我在控制器中,我可以使用Symfony自动装配或使用lexik_jwt_authentication.encoder的公共别名来像这样使用:

$this->container->get('lexik_jwt_authentication.encoder')

在我的测试中手动加载服务,如下所示似乎是低效的,因为构造函数的一些参数是一些对象,并且它们自己的构造函数的一些参数是对象,并且......

new Lexik\Bundle\JWTAuthenticationBundle\Encoder\DefaultEncoder([some objects here])

这就是自动装配的好处:您只需获得您想要使用的服务。

=&GT;在我的考试中获得此项服务的最佳方式是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

Symfony 4.1现在可以使用KernelTestCase

在测试中加载私有服务了。