如何覆盖用户提供程序以使用Symfony 3进行测试?

时间:2017-01-28 19:40:48

标签: php symfony

我有以下security.yml:

security:

    # http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
    providers:
        in_memory:
            memory: ~
        bd_provider:
            entity:
                class: AppBundle:Usuario
                property: email

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~

            form_login:
                login_path: login
                check_path: login

            provider: bd_provider

            logout:
                path:   /logout
                target: /login

我正在通过这种方式验证测试porpuses:

protected function createClientWithAuthentication()
{
    /* @var $client Client */
    $client = static::createClient();

    /* @var $user UserInterface */
    $user = $client->getContainer()->get('doctrine')->getRepository('AppBundle:Usuario')->find(5);

    $firewallName = 'main';
    $token = new UsernamePasswordToken($user, $user->getPassword(), $firewallName, $user->getRoles());
    $session = $client->getContainer()->get('session');
    $session->set('_security_' . $firewallName, serialize($token));
    $session->save();

    $cookie = new Cookie($session->getName(), $session->getId());
    $client->getCookieJar()->set($cookie);

    return $client;
}

但我想使用不同的提供程序进行测试,例如in_memory。所以我在config_test.yml

中添加了以下内容
security:
    providers:
        em_memoria:
            memory:
                users:
                    email@example.com:
                        password: senha
                        roles: 'ROLE_SUPER_ADMIN'

    encoders:
            AppBundle\Entity\Usuario: plaintext

    firewalls:
        main:
            provider: em_memoria

但是当我改变将用户组装成代码的代码时:

$user = new Usuario();
$user
    ->setUsername('email@example.com')
    ->setPassword('admin')
    ->setRole('ROLE_USER_ADMIN');

测试将我发送到登录页面,就像我使用的是不正确的用户一样。我在这里错过了什么?还有什么我应该做的吗?

如果有任何其他信息是必要的,请告诉我,我会在这里提供。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以将别名用作用户提供程序,并在不同环境中引用不同的服务。

firewalls:
    main:
        provider: app.user_provider

conf.yml:

services:
    app.user_provider:
       alias: bd_provider

conf_test.yml:

services:
    app.user_provider:
       alias: em_memoria

答案 1 :(得分:0)

我无法使其工作,因此我将测试环境中的数据库配置为SQLite数据库。我还创建了一些DataFixtures来加载初始数据,并在我的bootstrap文件中调用了theese fixtures。