Не удается получить доступ к защищенным страницам после входа в функциональный тест Symfony - PullRequest
2 голосов
/ 21 июня 2011

В настоящее время я пытаюсь протестировать приложение Symfony с защищенными страницами, используя функциональные тесты.

Сценарий

  1. Войдите в систему как пользователь, который является суперадмином (таким образом, обходя любую проверку учетных данных)
  2. Просмотр защищенной страницы (здесь отображается список документов)
  3. Проведите несколько различных тестов, чтобы проверить различные требования.

Задача

Когда я просматриваю защищенную страницу, вместо 200 HTTP кода, я получаю 401 "Unauthorized" HTTP code, что означает, что я пытаюсь получить доступ к странице без аутентификации / без необходимых учетных данных.

Даже если я войду в систему как обычный пользователь с соответствующими учетными данными Symfony, я все равно получу 401 error.

Используемый код

//CapWebndfTestFunctional.class.php

class CapWebndfTestFunctional extends sfTestFunctional
{
  /**
* Login as a user
* @param string $username User's username
*/
  public function signInAs($username)
  {
    $user = Doctrine_Core::getTable('sfGuardUser')->findOneByUsername($username);

    //force the context to be created
    $this->browser->getContext(true)->getUser()->signIn($user);

    $this->info(sprintf('Signin user using username "%s"', $username));

    if ($user->getIsSuperAdmin())
    {
      $this->info('Beware, you are logged as a superadmin!');
    }

    return $this;
  }

}

Тестовый набор:

<?php

$browser = new CapWebndfTestFunctional(new sfBrowser());

$browser->
  signInAs('superadmin')->
  with('user')->begin()->
    isAuthenticated()-> //ensure that I'm well authenticated
  end()->

  get('/document')-> //a secured page
  with('request')->begin()->
    isParameter('module', 'document')->
    isParameter('action', 'index')->
  end()->

  with('response')->begin()->
    isStatusCode(200)-> //as superadmin is a sfGuard superadmin, this should be 200;
  end()->
  // Here some other tests...

/* Outputs :
clem@ubuntu:/var/www/cap_webndf/trunk$ php symfony test:functional backend documentActions
> Signin user using username "superadmin"
> Beware, you are logged as a superadmin!
ok 1 - user is authenticated
# get /document
ok 2 - request parameter module is document
ok 3 - request parameter action is index
not ok 4 - status code is 200
# Failed test (./lib/vendor/symfony/lib/test/sfTesterResponse.class.php at line 412)
# got: 401
# expected: 200
*/

Я действительно застрял на этом, так что спасибо за любую помощь.

Редактировать : Если хотите, вот использованный код в сущности

РЕДАКТИРОВАТЬ : В чем разница между переходом на страницу входа и отправкой (поддельным) почтовым запросом и прямым входом в систему с помощью специального метода sfGuard?

1 Ответ

0 голосов
/ 21 июня 2011

Я не думаю, что вы можете использовать SignIn () подобным образом, поскольку он не установит cookie в браузере, поэтому на следующей странице вы снова выйдете из системы.

Всякий раз, когда я проводил функциональное тестирование с пользователями, я заходил на страницу входа в систему, вводил имя пользователя / пароль пользователя и входил в систему как они.

Я не проверял это, но что-то вроде этого должно работать, я обычно использую тестовых пользователей и знаю их пароль

// CapWebndfTestFunctionnal.class.php

class CapWebndfTestFunctionnal extends sfTestFunctional
{
  /**
* Login as a user
* @param string $username User's username
*/
  public function signInAs($username)
  {
    $tempPassword = rand(1000, 9999999);

    $user = Doctrine_Core::getTable('sfGuardUser')->findOneByUsername($username);
    $oldPassword = $user->getPassword();

    $user->setPassword($tempPassword);
    $user->save();

    $this->info(sprintf('Signin user using username "%s"', $username));

    $this->post('/login', array('username' => $user->getUsername(), 'password' => $tempPassword))->isRedirected();

    if ($user->getIsSuperAdmin())
    {
      $this->info('Beware, you are logged as a superadmin!');
    }

    $user->setPasswordHash($oldPassword);
    $user->save();

    return $this;
  }
}
...