首页 文章

FOSUserBundle单元测试

提问于
浏览
4

我正在使用fosUserBundle设置站点 . 我需要编写一些单元测试,但我似乎无法使身份验证正常工作以与它们一起使用 . 我已经尝试了一些没有运气的方法 .

approach1 - 安全设置中的链提供商,以进行我可以依赖的标准登录 . 当我这样做时,唯一有效的身份验证是in_memory提供程序,这意味着我可以使用admin用户登录,但不能使用fosUserBundle创建的任何用户登录

security.yml

security:
    encoders:
        "FOS\UserBundle\Model\UserInterface": plaintext
        "Symfony\Component\Security\Core\User\User": plaintext

    providers:
        chain_provider:
            providers: [in_memory, fos_userbundle]
        in_memory:
            users:
                admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
        fos_userbundle:
            id: fos_user.user_manager


    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                login_path:  /
                csrf_provider: form.csrf_provider
                default_target_path: /media
            logout:       true
            anonymous:    true
            http_basic:
                provider: in_memory

方法2-我在单元测试的设置中创建了一个用户 . 但是使用这种方法我永远无法使用我刚刚创建的用户登录,我不需要用户确认 .

public function setUp() {

        $kernel = static::createKernel();
        $this->repo = $kernel->boot();
        $this->repo = $kernel->getContainer();

        $userManager = $this->repo->get('fos_user.user_manager');

        $email = "testing".(string) self::newRandomNumber()."@test.com";
        $un = "test".(string) self::newRandomNumber();
        $fn = "testin";
        $ln = "laster";
        $pwd = "passworD1";

        $user = $userManager->createUser();

        $user->setEmail($email);
        $user->setUsername($un);
        $user->setFirstName($fn);
        $user->setLastName($ln);
        $user->setPlainPassword($pwd);
        $user->setBimStaff(True);

        // Persist the user to the database         
        $userManager->updateUser($user);

        $this->user = $user;

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

        $form = $crawler->selectButton('Login')->form();

        // set some values
        $un = 'Lucas'.self::newRandomNumber();
        $form['_username'] = $un;
        $form['_password'] = $pwd;

        // submit the form

        $crawler = $this->client->submit($form);
        print_r($this->client->getResponse());

        $this->client->followRedirects();

    }

我已尝试登录表单和http基本身份验证,但似乎都不起作用 .

有人有什么建议吗?

谢谢,科里

2 回答

  • 4

    嗯,似乎如果你在安全性中链接提供者,你不能只使用其中一个提供者,至少为我解决了这个问题 .

    // security.yml 
    providers:
        chain_provider:
            providers: [in_memory, fos_userbundle]
        in_memory:
            users:
                admin: { password: admin, roles: [ 'ROLE_ADMIN' ] }
        fos_userbundle:
            id: fos_user.user_manager
    
    
    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: chain_provider
                login_path:  /
                csrf_provider: form.csrf_provider
                default_target_path: /media
            logout:       true
            anonymous:    true
            http_basic:
                provider: chain_provider
    

    一旦我将两个供应商都改为 chain_provider 它就开始合作了 .

    我的单元测试现在看起来像这样

    public function setUp() {
    
        $kernel = static::createKernel();
        $this->repo = $kernel->boot();
        $this->repo = $kernel->getContainer();
    
    
        $this->client = static::createClient(array(), array(
            'PHP_AUTH_USER' => 'admin',
            'PHP_AUTH_PW'   => 'admin',
        ));
        $this->client->followRedirects();
    
    }
    

    如果复制这个我会建议你的用户使用更强的密码:)

  • 1

    我有同样的问题,但我希望选项2能够工作 . 你的榜样几乎就在那里并帮助了我 . 我认为它没有启用't working for you is that the user wasn't的原因 . FOSUserBundle中的用户构造函数默认会创建禁用的用户,因此您必须调用 $user->setEnable(true)

    这是我的工作示例

    use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
    use Symfony\Component\BrowserKit\Cookie;
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
    
    class MyControllerTest extends WebTestCase
    {
        private $client = null;
    
        public function setUp()
        {
            $this->client = static::createClient();
        }
    
        private function logIn()
        {
            $session = $this->client->getContainer()->get('session');
    
            $userManager = $this->client->getContainer()->get('fos_user.user_manager');
    
            $user=$userManager->findUserByUsername('tester');
            if (!$user) {
                $user = $userManager->createUser();
    
                $user->setEmail('test@example.com');
                $user->setUsername('tester');
                $user->setPlainPassword('foo');
                $user->setEnabled(true);
                $user->addRole('ROLE_SUPER_ADMIN');
    
                $userManager->updateUser($user);
            }
    
            $firewall = 'main_firewall';
            $token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_SUPER_ADMIN'));
    
            $session->set('_security_'.$firewall, serialize($token));
            $session->save();
    
            $cookie = new Cookie($session->getName(), $session->getId());
            $this->client->getCookieJar()->set($cookie);
        }
    
        public function testCompleteScenario()
        {
            $this->logIn();
    
            $crawler = $this->client->request('GET', '/foo/');
            $this->assertEquals(200, $this->client->getResponse()->getStatusCode(),
                "Unexpected HTTP status code for GET /foo/".$this->client->getResponse()->getContent());
    
        }
    
    }
    

相关问题