Symfony2 / Doctrine2 で Behat を使用しています。ここで、「ログインして /login に移動する場合は、代わりに / に移動する必要がある」という事実に要約されるこのシナリオがあります。
@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);
}
「/login に移動するとき」コード (コントローラーが呼び出される) では、トークンがなくなったように見えます (意図したものではありません)。
/**
* @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 ...) にフックできればいいと思います。
(テストのために認証メカニズムを無効にすることに関する提案、またはユーザーをスタブ/モックする方法も歓迎します。)