2017-03-03 10 views
1

フォームを前処理して最終的に保存するサービスをテストしようとしています。そのフォームの作成中:Symfony3-authenticated with Testサービス

フィールドのデフォルト値として現在ログインしているユーザーを取得するために呼び出されます。

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'    => '[email protected]' 
    ]); 

    $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); 
} 

しかし、それは私にエラーを与える:

は、今のところ私はこの(Symfony\Bundle\FrameworkBundle\Test\WebTestCaseを拡張)を有する午前はセキュリティトークンが存在しないことを示して何

Call to a member function getUser() on null 

どうすればいいですか?私は運で、そのコードを試してみました@LBAのコメントへの

UPDATE

ありがとう:

$session = self::$kernel->getContainer()->get('session'); 
$token = new UsernamePasswordToken('root', 'root', 'main', ['ROLE_USER', 'ROLE_ROOT']); 
$session->set('_security_main', serialize($token)); 
$session->save(); 

一部説明hereとしてクッキーを設定して$kernelを有しているので、不足していますいいえメソッドgetCookieJar()

+0

setUpの後にログインしたユーザーがいることを確認してください。 – LBA

+0

@LBA最新のコードをご覧ください。私はオプション配列を 'bootKernel()'に渡すことで間違っていました。しかし、それも働いていません。 – philipp

+0

まだユーザーのログイン方法がわかりません。アプリケーションでログインはどのように行われますか?あなたはサーバーパラメータ/ヘッダーとして各要求でユーザー名とパスワードを送信していませんか? – LBA

答えて

1

私はついにそれをそうするようにできました:

protected function setUp() 
{ 
    self::bootKernel(); 

    $root = new User(); 
    $root->setUsername('root'); 
    $root->setPassword('root'); 
    $root->setEmail('[email protected]'); 

    $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'); 
} 

しかししかししかしこれはテストケースにはフォームを壊すので、それがその問題を解決することが可能であるとしても、この場合、本当の問題は、フォームとその$this->container->get('security.token_storage')->getToken()->getUser();コールを持つこと、です。そのようなことが起こらないようにするためのパターンは、依存型インジェクションであり、私がフォームタイプに適用しなかったものです。

だから、より良い解決策は、(AbstractTypeを拡張する形で)次のようになります。

public function configureOptions(OptionsResolver $resolver) 
{ 
    $this->setDefined(['user]); 
} 

そして最後には、unittestの内でそう(コントローラーまたはのTestCaseで)

のようなフォームを作成します。

$user = new User(); 

およびコントローラ内:

$user = $this->container->get('security.token_storage')->getToken()->getUser(); 

$form = $this->formFactory->create(TheFormType::class, 
    <some data object>, 
    ['user' => $user]); 
+0

うれしい – LBA

関連する問題