Symfony功能测试in_memory用户getId

时间:2016-06-12 19:56:13

标签: php symfony phpunit

我在Symfony 3中有一个带有Web应用程序和REST API的应用程序。

我正在使用Symfony \ Bundle \ FrameworkBundle \ Test \ WebTestCase编写功能测试

$this->client = static::createClient(array(), array(
        'PHP_AUTH_USER' => 'test',
        'PHP_AUTH_PW' => 'test',
    ));

public function testIndex()
{
    $this->client->request(
        'GET',
        '/titles'
    );
    $response = $this->client->getResponse();
    $this->assertEquals(200, $response->getStatusCode());
}

我有API的OAuth身份验证和webapp的form_login。 对于我的测试,我使用http_basic,这是我的config_test.yml:

security:
encoders:
        Symfony\Component\Security\Core\User\User: plaintext
firewalls:
    api:
        http_basic: ~
    main:
        http_basic: ~
providers:
    in_memory:
        memory:
            users:
                test:  { password: test, roles: [ 'ROLE_USER' ] }

在我的控制器中,我得到像这样的用户:

$this->getUser()->getId()

当我启动phpunit时,我得到了

Error: Call to undefined method Symfony\Component\Security\Core\User\User::getId()

它没有使用我的用户实体进行测试,我该怎么办?

1 个答案:

答案 0 :(得分:0)

  

它没有使用我的用户实体进行测试

这是因为内存提供程序uses the built in UserInterface implementation。 InMemoryUserProvider将永远不会使用您的实体 - 它基于与教条用户提供商完全不同的系统。

你有几种解决方法。

  1. 像往常一样使用数据库和学说。这绝对是你应该做的:端到端测试应该是真正的端到端才有用。此外,如果您未在测试中使用数据库和学说,那么与用户实体相关的内容(通过外键)将会失败。
  2. 创建custom user provider,模仿InMemoryUserProvider的行为,但使用您的自定义实体类。