2013-05-30 3 views
5

기본 인증을 사용하여 보안 설정되었으며 보안 컨텍스트에서 사용자를 검색해야하는 API 호출 메서드를 테스트하려고합니다.테스트 환경의 보안 컨텍스트에서 사용자를 가져올 수 없습니다.

내 config_test.yml 파일 (I 테스트 ENV 용 메모리 내장 데이터베이스를 사용하고 있습니다) :

imports: 
    - { resource: config_dev.yml } 

doctrine: 
    dbal: 
     driver: pdo_sqlite 
     path: :memory: 
     memory: true 
    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     auto_mapping: true 

framework: 
    test: ~ 
    session: ~ 
    profiler: 
     enabled: false 

web_profiler: 
    toolbar: false 
    intercept_redirects: false 

swiftmailer: 
    disable_delivery: true 

다음과 같이 내가 클라이언트를 인스턴스화 테스트를 만들었습니다

$options = array(
     'environment' => 'test', 
     'debug'  => true, 
    ); 

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

시험은 다음과 같습니다

public function testProfileAction() 
{ 
    $mockUser = new User(); 
    $mockUser->setUsername("user"); 
    $mockUser->setEmail("[email protected]"); 
    $mockUser->setName("User"); 
    $mockUser->setSurname("User"); 
    $mockUser->setPlainPassword("1234567890"); 
    $this->em->persist($mockUser); 
    $this->em->flush(); 

    $crawler = $this->client->request('GET', '/api/1/user/profile', array(), array(), array(
     'PHP_AUTH_USER' => 'user', 
     'PHP_AUTH_PW' => '1234567890', 
    )); 
    $this->assertEquals(200, $this->client->getResponse()->getStatusCode()); 
} 

그리고 그 방법은 보안 컨텍스트에서 사용자를 얻을 필요가있다.

$user = $this->get('security.context')->getToken()->getUser(); 

그러나 테스트를 실행하면 항상 200 대신 401이됩니다. 메소드에서 $ user 변수를 항상 덤프하는 것은 항상 null입니다.

Symfony 2.2와 FOSUserBundle을 사용하고 있습니다.

미리 감사드립니다.

답변

5

나는 동일한 문제가있었습니다. @nifr가 말한 것처럼, 토큰을 생성해야하지만, 그것을 직렬화하고 쿠키를 생성해야한다. 여기 내가 어떻게 그랬어.

$token = new UsernamePasswordToken($mockUser, null, $firewallName, array($role)); 
self::$kernel->getContainer()->get('security.context')->setToken($token); 
self::$kernel->getContainer()->get('session')->set('security'.$firewallName, serialize($token)); 
self::$kernel->getContainer()->get('session')->save(); 

$cookie = new Cookie(self::$kernel->getContainer()->get('session')->getName(),  self::$kernel->getContainer()->get('session')->getId()); 
$this->client->getCookieJar()->set($cookie); 
0

토큰을 보안 컨텍스트에서 액세스하려면 먼저 만들어야합니다.

$firewallName = 'main'; 
$role = 'ROLE_USER'; 

$token = new UsernamePasswordToken($user, null, $firewallName, array($role)); 
self::$kernel->getContainer()->get('security.context')->setToken($token); 

here에서 귀하의 케이스에 적용.