2013-05-30 10 views
5

में सुरक्षा प्रसंग से उपयोगकर्ता तक नहीं पहुंच सकता मैं एक API कॉल विधि है जो मूल प्रमाणीकरण और जो सुरक्षा संदर्भ से उपयोगकर्ता को पुनः प्राप्त करने की जरूरत है का उपयोग कर securized है परीक्षण करने के लिए कोशिश कर रहा हूँ।परीक्षण वातावरण

मेरे config_test.yml फ़ाइल (मैं में स्मृति डेटाबेस का उपयोग कर रहा परीक्षण 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(); 

लेकिन, परीक्षण मैं हमेशा एक 401 के बजाय एक 200 विधि में $ उपयोगकर्ता चर डम्पिंग की मिल चल हमेशा रिक्त है।

मैं 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 से अपने मामले के लिए अनुकूलित।

संबंधित मुद्दे