具有身份验证的Symfony3-Test Service

时间:2017-03-03 11:15:52

标签: unit-testing symfony

我正在尝试测试一个预处理表单并最终保存它的服务。在创建该表单时:

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]"

,因此缺少设置Cookie here所述的部分

1 个答案:

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