我正在尝试测试一个预处理表单并最终保存它的服务。在创建该表单时:
Symfony\Bundle\FrameworkBundle\Test\WebTestCase
调用以将当前登录的用户作为字段的默认值。
现在我有了这个(扩展private $pages;
private $formFactory;
protected function setUp()
{
self::bootKernel();
$client = self::$kernel->getContainer()->get('test.client');
$client->setServerParameters([
'HTTP_HOST' => 'ajax.localhost.dev:10190',
'CONTENT_TYPE' => 'application/json',
'HTTP_X-Requested-With' => 'XMLHttpRequest',
'HTTP_USER_AGENT' => 'Symfony/2.0',
'PHP_AUTH_USER' => 'root',
'PHP_AUTH_PW' => 'root@localhost.dev'
]);
$this->pages = self::$kernel->getContainer()->get('app.pages');
$this->formFactory = self::$kernel->getContainer()->get('form.factory');
}
public function testNewPage() {
$page = new Page();
//shortened
$form = $this->formFactory->create(PageType::class, $page);
}
):
Call to a member function getUser() on null
但这给了我错误:
$session = self::$kernel->getContainer()->get('session');
$token = new UsernamePasswordToken('root', 'root', 'main', ['ROLE_USER', 'ROLE_ROOT']);
$session->set('_security_main', serialize($token));
$session->save();
什么表明没有安全令牌。
我怎么能过来?
更新
感谢@LBA的评论我尝试了那段代码,没有运气:
$kernel
由于getCookieJar()
没有方法str1="[00:00:0.047] [TestRunner] [Main] [sleep_assoc] > [Iteration:0][00:00:0.063] [TestRunner] [Main] [sleep_assoc] > [!Iteration:0][00:00:0.063]"
答案 0 :(得分:1)
我终于可以让它像这样工作:
protected function setUp()
{
self::bootKernel();
$root = new User();
$root->setUsername('root');
$root->setPassword('root');
$root->setEmail('root@localhost.dev');
$token = new UsernamePasswordToken($root, null, 'main', ['ROLE_USER', 'ROLE_ROOT']);
self::$kernel->getContainer()
->get('security.token_storage')
->setToken($token);
$this->pages = self::$kernel->getContainer()->get('app.pages');
$this->formFactory = self::$kernel->getContainer()->get('form.factory');
}
但是 但是 但是即使有可能解决这个问题,在这种情况下真正的问题是,{{ 1}}使用表单调用,因为这会破坏测试用例中的表单。防止这种事情发生的模式是依赖注入,我错过了在表单类型上应用的内容。
所以更好的解决方案是(在表格中扩展AbstractType):
$this->container->get('security.token_storage')->getToken()->getUser();
最后创建这样的表单(在Controller 或 TestCase中)
在UnitTest中:
public function configureOptions(OptionsResolver $resolver)
{
$this->setDefined(['user]);
}
并在控制器中:
$user = new User();