当前位置: 首页 > 知识库问答 >
问题:

FOSUserBundle单元测试

南门茂才
2023-03-14

我正在用foUserBundle建立一个网站。我需要编写一些单元测试,但我似乎无法获得正确使用它们的身份验证。我试过几个方法,都没有运气。

Approach 1-在安全设置中链接提供程序,以进行我可以依赖的标准登录。当我这样做时,唯一有效的身份验证是内存提供程序,这意味着我可以使用管理员用户登录,但不能使用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个答案

郑星辰
2023-03-14

我也有同样的问题,但我想让选项2起作用。你的榜样就在那里,对我很有帮助。我认为它不适用于您的原因是用户未启用。默认情况下,FOSUserBundle中的用户构造函数将创建禁用的用户,因此您必须调用$user-

这是我的工作例子

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());

    }

}

端木令
2023-03-14

嗯,似乎如果你在安全链提供商,你不能只使用一个提供商,至少这解决了我的问题。

// 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();

}

如果复制这一点,我建议您的用户使用更强的密码:)

 类似资料:
  • 我已经成功覆盖了FOSUserbundle的用户类,添加了一堆属性。但是当我尝试添加“类型”属性时,您可以在下面看到,我有以下异常: 属性“Types”和方法“add typ()”/“remove typ()”、“addType()”/“remove type()”、“setTypes()”、“types()”、“__set()”或“__call()”都不存在,并且在类“advert projec

  • 单元测试涉及测试软件应用程序的每个单元或单个组件。这是第一级软件测试。单元测试的目的是验证单元组件的性能。 单元是软件系统的单个可测试部分,并在应用程序软件的开发阶段进行测试。 此测试旨在测试隔离代码的正确性。单元组件是应用程序的单独功能或代码。白盒测试方法用于单元测试,通常由开发人员完成。 在测试级别层次结构中,单元测试是在集成和其他剩余测试级别之前完成的第一级测试。它使用模块进行测试,减少了等

  • 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如 C 语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进

  • 我们从 Hello World 项目入手,增加单元测试功能。 我们新家了一个名为hello-world-test的 Gradle 项目。 环境 Gradle 3.4.1 Spring Boot 1.5.2.RELEASE Thymeleaf 3.0.3.RELEASE Thymeleaf Layout Dialect 2.2.0 Spring Security Test 4.2.2.RELEASE

  • 单元测试验证单个代码单元是否按预期工作。 也就是说,给定不同的输入参数, 测试验证类方法返回预期结果。 单元测试通常由编写待测试类的人开发。 Yii的单元测试框架 Codeception 基于 PHPUnit,Codeception 建议遵从 PHPUnit 的文档的进行开发: Codeception for Yii framework Codeception Unit Tests PHPUnit

  • 单元测试 ClojureScript 的测试和 Clojure 语法类似, 通过 cljs.test 来提供. 首先需要引用下面这些函数或者 Macros: (ns my-project.tests (:require [cljs.test :refer-macros [deftest is testing run-tests]])) 然后可以定义一个测试: (deftest test-num