1

FOSUserBundle を使用する Symfony 2 アプリの単体テストを作成しています。この同様の質問とは異なり: FOSUserBundle Unit testing

ただし、私は HTTP 認証 (ログイン フォームのみ) を使用せず、偽のメモリ内エンティティではなく、実際のユーザー エンティティを使用する必要があります。

多くの検索と試行にもかかわらず、私はそれを機能させることができず、プロセス全体が非常に不透明であるため、どこから始めればよいかさえわかりません. ここに私が持っているコードがあります:

protected $em;
protected $client;
protected $testuser;

public function setUp() { 
    $kernel = static::createKernel();
    $kernel->boot();
    $this->em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
    $this->em->beginTransaction();

    $this->client = static::createClient();

    $usermanager = $kernel->getContainer()->get('fos_user.user_manager');
    $this->testuser = $usermanager->createUser();
    $this->testuser->setUsername('test');
    $this->testuser->setEmail('test@lemuria.org');
    $this->testuser->setPlainPassword('test');
    $usermanager->updateUser($this->testuser);
}


public function testLogin() {
    $crawler = $this->client->request('GET', '/en/login');
    $form = $crawler->selectButton('_submit')->form(array(
        '_username'  => 'test',
        '_password'  => 'test',
        ));     
    $this->client->submit($form);

    $this->assertTrue($this->client->getResponse()->isRedirect(), 'should be redirected');
    $this->assertTrue($this->client->getResponse()->isRedirect('http://localhost/en/account'), 'should be redirected to account page');

    $crawler = $this->client->followRedirect();

2番目のアサーションで失敗します。私が知る限り、ログインページにリダイレクトされます。

ログインが失敗する理由を単純に理解することは明らかに不可能であるため、どこから解決策を探し始めればよいかさえわかりません。

4

2 に答える 2

2

echo $this->client->getResponse()->getContent()エラーを探すことができる実際の応答を表示するために追加してみることができます

于 2013-02-16T20:57:33.700 に答える
1

を作成し、次のようAbstractControllerTestに承認済みクライアントを作成しsetUp()ます。

abstract class AbstractControllerTest extends WebTestCase
{
    /**
     * @var Client
     */
    protected $client = null;


    public function setUp()
    {
        $this->client = $this->createAuthorizedClient();
    }

    /**
     * @return Client
     */
    protected function createAuthorizedClient()
    {
        $client = static::createClient();
        $container = $client->getContainer();

        $session = $container->get('session');
        /** @var $userManager \FOS\UserBundle\Doctrine\UserManager */
        $userManager = $container->get('fos_user.user_manager');
        /** @var $loginManager \FOS\UserBundle\Security\LoginManager */
        $loginManager = $container->get('fos_user.security.login_manager');
        $firewallName = $container->getParameter('fos_user.firewall_name');

        $user = $userManager->findUserBy(array('username' => 'REPLACE_WITH_YOUR_TEST_USERNAME'));
        $loginManager->loginUser($firewallName, $user);

        // save the login token into the session and put it in a cookie
        $container->get('session')->set('_security_' . $firewallName,
            serialize($container->get('security.context')->getToken()));
        $container->get('session')->save();
        $client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));

        return $client;
    }
} 

注:ユーザー名をテスト ユーザー名に置き換えてください。

次に、 を拡張しAbstractControllerTest、グローバル$clientを使用して次のようにリクエストを作成します。

class ControllerTest extends AbstractControllerTest
{
    public function testIndexAction()
    {
        $crawler = $this->client->request('GET', '/admin/');

        $this->assertEquals(
            Response::HTTP_OK,
            $this->client->getResponse()->getStatusCode()
        );
    }
}

この方法はテスト済みで、正常に動作します

于 2014-12-01T07:03:23.710 に答える