2016-07-30 17 views
0

認証フォームで保護されたページを機能テストしようとしています。Silex PHPフレームワークの機能テストで認証されたユーザーをシミュレートする方法

私のコードは、このリンクに基づいています:http://symfony.com/doc/current/testing/simulating_authentication.html

しかし、それはまだ私のために動作しません。ここで

は私が手THYEエラーメッセージです:ここで

PHP Fatal error: Call to undefined method Symfony\Component\HttpKernel\Client::getContainer() 

は私のコードです:ここでは

class ClientTest extends WebTestCase { 

    public function createApplication() 
    { 
     return require __DIR__.'/../app.php'; 
    } 

    /** 
    * @test 
    */ 
    public function index_when_no_clients() 
    { 
     $this->client = $this->createClient(); 
     $crawler = $this->client->request('GET', '/'); 

     $this->assertTrue($this->client->getResponse()->isOk()); 
     $this->assertCount(1, $crawler->filter('h1:contains("Clients")')); 
     $this->assertCount(1, $crawler->filter('span[class="glyphicon glyphicon-plus"]')); 
    } 

    /** 
    * @test 
    */ 
    public function add_get_route_is_valid() 
    { 
     $client = $this->createClient(); 
     $session = $client->getContainer()->get('session'); 

     // the firewall context (defaults to the firewall name) 
     $firewall = 'secured_area'; 

     $token = new UsernamePasswordToken('admin', null, $firewall, array('ROLE_ADMIN')); 
     $session->set('_security_'.$firewall, serialize($token)); 
     $session->save(); 

     $cookie = new Cookie($session->getName(), $session->getId()); 
     $client->getCookieJar()->set($cookie); 
     $crawler = $client->request('GET', '/add'); 

     $this->assertTrue($client->getResponse()->isOk()); 
    } 
} 

は私が私のindex.phpに認証を設定しています方法です:

$app->register(new \Silex\Provider\SessionServiceProvider(), [ 
    'session.test' => 'test' === $app['env'], 
]); 
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'admin' => array(
      'pattern' => '^/add', 
      'form' => array('login_path' => '/login', 'check_path' => '/add/login_check'), 
      'users' => $app->share(function() use ($app) { 
       $config = Configuration::getInstance(); 
       $pdoQueries = new PdoQueries(PdoConnection::getInstance($config)); 
       return new UserProvider($pdoQueries); 
      }), 
     ), 
    ) 
)); 

$app->get('/login', function(Request $request) use ($app, $arrConfig) { 
    return $app['twig']->render('auth/form.twig', array(
      'error'   => $app['security.last_error']($request), 
      'last_username' => $app['session']->get('_security.last_username'), 
      'title'   => 'Login', 
      'assetsUrl'    => $arrConfig['assets_url'] 
    )); 
}); 

次に、createApplicationで呼び出されるapp.phpの内容を示します。

私は、問題と解決策を見つけたの
<?php 
require __DIR__ ."/../www/index.php"; 
unset($app['exception_handler']); 
return $app; 

おかげ

答えて

3

問題はgetContainerステートメントでした。依存性注入は、シレックスでは異なる方法で呼び出されます。ちょうど呼び出す

$app['session'] 

は直接問題を解決しました。

ここには、インポートするsymfonyクラスの完全なスクリプトもあります。

<?php 
use Silex\WebTestCase; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 
use Symfony\Component\BrowserKit\Cookie; 

class ClientTest extends WebTestCase { 

    public function createApplication() 
    { 
     return require __DIR__.'/../app.php'; 
    } 

    private function logIn($client) 
    { 
     $session = $this->app['session']; 
     $firewall = 'admin'; 
     $token = new UsernamePasswordToken('admin', null, $firewall, array('ROLE_ADMIN')); 
     $session->set('_security_'.$firewall, serialize($token)); 
     $session->save(); 
     $cookie = new Cookie($session->getName(), $session->getId()); 
     $client->getCookieJar()->set($cookie); 

     return $client; 
    } 

    /** 
    * @test 
    */ 
    public function index_when_no_clients() 
    { 
     $this->client = $this->createClient(); 
     $crawler = $this->client->request('GET', '/'); 

     $this->assertTrue($this->client->getResponse()->isOk()); 
     $this->assertCount(1, $crawler->filter('h1:contains("Clients")')); 
     $this->assertCount(1, $crawler->filter('span[class="glyphicon glyphicon-plus"]')); 
    } 

    /** 
    * @test 
    */ 
    public function add_get_route_is_valid() 
    { 
     $client = $this->createClient(); 
     $client = $this->logIn($client); 
     $crawler = $client->request('GET', '/add'); 

     $this->assertTrue($client->getResponse()->isOk()); 
    } 

} 

希望は他の人に役立つでしょう。