我正在用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起作用。你的榜样就在那里,对我很有帮助。我认为它不适用于您的原因是用户未启用。默认情况下,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());
}
}
嗯,似乎如果你在安全链提供商,你不能只使用一个提供商,至少这解决了我的问题。
// 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