BehatはSymfony2ユーザーを認証します

私はSymfony2/Doctrine2でBehatを使っています。さて、私はこのシナリオを持っています。「ログインしてログインすると/代わりに行く」

@login
Scenario: Go to the login page while being logged in
  Given I am logged in
  When I go to "/login"
  Then I should be on "/"

@loginについては、私は以下を作成しました:

/**
 * @BeforeScenario @login
 */
public function loginUser()
{
    $doctrine = $this->getContainer()->get('doctrine');
    $userRepository = $doctrine->getRepository('MyTestBundle:User');
    $user = $userRepository->find(1);//1 = id

    $token = new UsernamePasswordToken($user, NULL, 'main', $user->getRoles());
    $this->getContainer()->get('security.context')->setToken($token);
}

“私が行く/ログインする”コード(コントローラが呼び出される)では、トークンは消え去っているように見えます(私が意図したものではありません):

/**
 * @Route("/login", name="login")
 */
public function loginAction()
{
    $token = $this->get('security.context')->getToken();
    $fd = fopen('/tmp/debug.log', 'a');
    fwrite($fd, $token);

   //prints 'AnonymousToken(user="anon.", authenticated=true, roles="")'
    ...

しかし、FeatureContextでは、それは(私はそれが動作することを期待した方法で)固執するようだ。
「私がログインしている」の場合:

/**
 * @Given /^I am logged in$/
 */
public function iAmLoggedIn()
{        
    $token = $this->getContainer()->get('security.context')->getToken();
    $fd = fopen('/tmp/debug.log', 'a');
    fwrite($fd, $token);

   //prints 'UsernamePasswordToken(user="admin", authenticated=true, roles="ROLE_ADMIN")'
    ...

私はこのように行動する:

app/console -e=test behat

私もコントローラでこれをテストして確認しました:

fwrite($fd, $this->get('kernel')->getEnvironment());
// prints 'test'

任意の手掛かりをどのようにユーザーを認証するには?私は多くの管理ページをテストしなければならないので、ログインを@BeforeSuite、@
BeforeFeature(または@BeforeScenario
…)にフックして、ブロックされないようにするといいでしょう。

(テストのための認証メカニズムを無効にする方法や、ユーザーをスタブ/モックする方法も歓迎します。)

ベストアンサー

ああ、私。
FeatureContext内のDICがあなたのアプリと共有されていないため、機能しません。アプリには別のカーネルとDICがあります。あなたはミンクを通してそれを得ることができます。または、あなたは単にそれを正しい方法で行うことができます:-)

正しい方法とは、エンドユーザが観測可能な動作のあらゆる部分を、FeatureContext内ではなく*。feature内に記述することを意味します。つまり、ユーザーにログインしたい場合は、「私はログインしています」、「ユーザー名を入力…」、「パスワードを入力してください」、および「stuf」などの手順を記述するだけです。
。複数回実行したい場合は、metastepを作成する必要があります。

Metasteps are simply steps, that describe multiple other steps,
for example – “i am logged in as everzet”. You could read bout them
here: http://docs.behat.org/guides/2.definitions.html#step-execution-chaining

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です