2012-02-07 13 views

उत्तर

0

यही कारण है मैं इसे कैसे परियोजनाओं में से एक के लिए लागू (FOSUserBundle साथ नहीं है, लेकिन शायद आप इसे उपयोगी मिल जाएगा)

private function createAuthorizedClient($role) 
{ 
    $userProvider = new YourUserProvider(...); 
    $user = $userProvider->createUserMethod(...); 

    $client = $this->createClient(); //Normal WebTestCase client 
    $client->getCookieJar()->set(new Cookie(session_name(), true)); 
    $session = self::$kernel->getContainer()->get('session'); 
    $token = new UsernamePasswordToken($user, 'password', 'main', array($role)); 
    $client->getContainer()->get('security.context')->setToken($token); 
    $session->set('_security_main', serialize($token)); 

    return $client; 
} 

मत भूलना उपयोगकर्ता ऑब्जेक्ट के लिए अपेक्षित परिणाम उपहास करने के लिए।

5

दरअसल, प्रमाणीकरण वास्तविक उपयोगकर्ता की तरह किया जाना चाहिए। उस मामले में, आप सादे पासवर्ड को जानते हैं और भरने के लिए लॉगिन प्रपत्र

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
class XXX extends WebTestCase { 
    public function testUserLogin() { 

    $client = static::createClient(); 
    $client->request('GET', '/login'); 

    $form = $crawler->selectButton('_submit')->form(array(
    '_username' => 'user', 
    '_password' => 'pa$$word', 
    )); 

    $client->submit($form); 
    $crawler = $client->followRedirect(); // "/" page 

    // if credentials were correct, you should be logged in and ready to test your app 
    } 
} 
+0

सिम्फनी 3.4 में काम करता है (धन्यवाद!) – HTDutchy

2

मैं जानता हूँ कि बहुत देर हो चुकी है .. लेकिन इस मामले में किसी को इस की जरूरत है, मैं इस तरह मेरी इकाई परीक्षण में एक उपयोगकर्ता logg में कामयाब :

<?php 

namespace Tests\Menu; 

use Tests\ContainerAwareUnitTestCase; 
use UserBundle\Entity\User; 
use FOS\UserBundle\Security\UserProvider; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 
use Symfony\Component\Security\Core\SecurityContext; 
use Symfony\Component\HttpFoundation\Request; 
use Menu\MenuBuilder; 

class MenuBuilderTest extends ContainerAwareUnitTestCase 
{ 
    public function provider() 
    { 
     return array(array('/')); 

    } 

    /** 
    * @dataProvider provider 
    */ 
    public function testNoAuth($uri) 
    { 
     /* @var $securityContext SecurityContext */ 
     $securityContext = $this->get('security.context'); 
     $userProvider = $this->get('fos_user.user_provider.username'); 
     $user = $userProvider->loadUserByUsername('alex'); 
     $token = new UsernamePasswordToken($user, null, 'main', array('ROLE_USER')); 
     $securityContext->setToken($token); 

     /* @var $menuBuilder MenuBuilder */ 
     $menuBuilder = $this->get('event_flow_analyser.menu_builder'); 

     $this->assertNotNull($menuBuilder); 

     $request = new Request(); 
     $request->attributes->set('projectName', 'ucs'); 

     $menu = $menuBuilder->createMainMenu($request); 

     $this->assertNotNull($menu); 

     $this->assertNotNull($menu->getChild('Home')); 
     $this->assertNotNull($menu->getChild('Profile')); 

     $this->assertEquals(null, $menu->getChild('Projects')); 
    } 

}  
:

<?php 
namespace Tests; 

class ContainerAwareUnitTestCase extends \PHPUnit_Framework_TestCase 
{ 
    protected static $kernel; 
    protected static $container; 

    public static function setUpBeforeClass() 
    { 
     self::$kernel = new \AppKernel('dev', true); 
     self::$kernel->boot(); 

     self::$container = self::$kernel->getContainer(); 
    } 

    public function get($serviceId) 
    { 
     return self::$kernel->getContainer()->get($serviceId); 
    } 
} 

2- तो इस प्रकार एक परीक्षण की घोषणा:

1- सबसे पहले आप सेवाओं का उपयोग करने के लिए एक वर्ग दे देंगे जो निर्धारित करें

यह एक पूर्ण उदाहरण menuBuilder निर्माण परीक्षण करने के लिए, लेकिन हालांकि एक छोटे से क्षेत्र से बाहर, कि निकालने अपनी जरूरत का जवाब देना चाहिए:

 $securityContext = $this->get('security.context'); 
     $userProvider = $this->get('fos_user.user_provider.username'); 
     $user = $userProvider->loadUserByUsername('alex'); 
     $token = new UsernamePasswordToken($user, null, 'main', array('ROLE_USER')); 
     $securityContext->setToken($token); 
3

इस सवाल का जवाब मौजूदा उपयोगी किया गया है, लेकिन उनमें से कोई मेरी समस्या हल सीधे। मैं सिम्फनी 2.3 का उपयोग कर रहा हूँ।

<?php 

namespace CDE\TestBundle\Base; 

use FOS\UserBundle\Model\User; 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\BrowserKit\Cookie; 
use Symfony\Component\BrowserKit\CookieJar; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage; 
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

class BaseUserTest extends WebTestCase { 

    protected $client; 
    protected $container; 
    protected $storage; 
    protected $session; 
    protected $user; 
    protected $cookieJar; 
    protected $cookie; 
    protected $token; 

    public function __construct() { 
     $this->client = static::createClient(); 
     $this->container = $this->client->getContainer(); 
     $this->storage = new MockFileSessionStorage(__dir__.'/../../../../app/cache/test/sessions'); 
     $this->session = new Session($this->storage); 

    } 

    public function getUserManager() { 
     return $this->container->get('cde_user.manager.user'); 

    } 

    public function getSecurityManager() { 
     return $this->container->get('fos_user.security.login_manager'); 

    } 

    public function getUser($role = null) { 
     if (!isset($this->user)) { 
      $user = $this->getUserManager()->loadByUsername('user'); 

      if (isset($user)) { 
       $this->user = $user; 
      } else { 
       $this->user = $this->getUserManager()->create(); 

       $this->user->setEnabled(true); 
       $this->user->setUsername('user'); 
       $this->user->setEmail('[email protected]'); 
       $this->user->setPlainPassword('user'); 
       $this->getUserManager()->updatePassword($this->user); 
       if (isset($role)) { 
        $this->user->addRole($role); 
       } 
       $this->getUserManager()->add($this->user); 
      } 

     } 

     return $this->user; 
    } 

    public function logIn(User $user, Response $response) { 
     $this->session->start(); 

     $this->cookie = new Cookie('MOCKSESSID', $this->storage->getId()); 
     $this->cookieJar = new CookieJar(); 
     $this->cookieJar->set($this->cookie); 
     $this->token = new UsernamePasswordToken($user, 'user', 'main', $user->getRoles()); 
     $this->session->set('_security_main', serialize($this->token)); 


     $this->getSecurityManager()->loginUser(
      $this->container->getParameter('fos_user.firewall_name'), 
      $user, 
      $response 
     ); 

     $this->session->save(); 
    } 

    public function removeUser(User $user) { 

    } 
} 

RestControllerTest.php

<?php 

namespace CDE\ContentBundle\Tests\Controller; 

use CDE\TestBundle\Base\BaseUserTest; 
use Symfony\Component\HttpFoundation\Response; 

class RestControllerTest extends BaseUserTest 
{ 
    protected $comment; 

    public function __construct() { 
     parent::__construct(); 
     $this->logIn($this->getUser('ROLE_ADMIN'), new Response()); 

    } 

    public function getGalleryManager() { 
     return $this->container->get('cde_content.manager.gallery'); 
    } 

    public function getAWSManager() { 
     return $this->container->get('cde_utility.manager.aws'); 
    } 

    public function createGallery() 
    { 
     //  Copy test.jpeg into the web folder 
     $filename = 'gallery/user-test.jpg'; 
     copy(__DIR__.'/../Mock/test.jpeg', __DIR__.'/../../../../../web/'.$filename); 
     $this->getAWSManager()->copyGalleryFile($filename); 


     $gallery = $this->getGalleryManager()->create(); 
     $gallery->setUser($this->getUser()); 
     $gallery->setFilename($filename); 
     $gallery->setTitle('test gallery'); 
     $gallery->setDescription('test gallery description'); 
     $gallery->setMarked(false); 
     $this->getGalleryManager()->add($gallery); 
     $this->assertEquals($gallery->getMarked(), false); 
    } 

    public function createComment() 
    { 
     $galleries = $this->getGalleryManager()->findByUser($this->getUser()); 
     $gallery = $galleries[0]; 

     $client = static::createClient(); 
     $client->getCookieJar()->set($this->cookie); 
//  $client = static::createClient(array(), new History(), $cookieJar); 

     $crawler = $client->request('POST', 'api/createComment/'.$gallery->getId(), array(
      'comment' => 'testing testing 123', 
      'marked' => 'false' 
     )); 

     $response = $client->getResponse(); 
     $this->comment = json_decode($response->getContent()); 
     $this->assertEquals($this->comment->comment, 'testing testing 123'); 
     $this->assertFalse($this->comment->marked); 
     $this->assertEquals($response->getStatusCode(), 200); 
    } 

    public function getComment() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', 'api/getComment/'.$this->comment->id); 

     $response = $client->getResponse(); 
     $comment = json_decode($response->getContent()); 
     $this->assertEquals($comment->comment, 'testing testing 123'); 
     $this->assertFalse($comment->marked); 
     $this->assertEquals($response->getStatusCode(), 200); 

    } 

    public function updateComment() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', 'api/updateComment'); 
    } 

    public function deleteComment() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('DELETE', 'api/deleteComment'); 
    } 

    public function getComments() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', 'api/getComments'); 
    } 

    public function getGalleries() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', 'api/getGalleries'); 
    } 

    public function removeGallery() { 
     $galleries = $this->getGalleryManager()->findByUser($this->getUser()); 
     foreach ($galleries as $gallery) { 
      $this->getGalleryManager()->remove($gallery); 
     } 

    } 

    public function testComments() { 
     $this->createGallery(); 
     $this->createComment(); 
     $this->getComment(); 
     $this->updateComment(); 
     $this->deleteComment(); 
     $this->getComments(); 
     $this->getGalleries(); 
     $this->removeGallery(); 
    } 

} 

कोड एक आधार परीक्षण वर्ग (BaseUserTest.php) है कि आसानी से उपयोगकर्ताओं में लॉग इन करने के लिए बढ़ाया जा सकता है शामिल हैं:

यहाँ मेरी समाधान है।

मैंने उदाहरण परीक्षा में बेस क्लास का उपयोग करने का उदाहरण भी शामिल किया है (RestControllerTest.php)। इस कोड को ब्लॉक सूचना RestControllerTest.php में:

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

BaseUserTest के पीछे विचार यह है कि यह, उसके अपने सत्र बना सकते हैं उपयोगकर्ता के साथ सत्र को पॉप्युलेट, और फिर MockFileSessionStorage का उपयोग कर फाइल सिस्टम के लिए सत्र को बचाने के।

परीक्षणों को स्वयं क्लाइंट पर कुकी सेट करना होगा।

+0

हाय, मुझे आपका समाधान पसंद है .. क्या आप कृपया अपनी कुछ सुरक्षा.इटल कॉन्फ़िगरेशन में पेस्ट कर सकते हैं। – r4ccoon

0

चूंकि मैं आपके समाधान पर टिप्पणी नहीं कर सकता, मुझे एक नया उत्तर बनाना है। असल में अन्य समाधान सही हैं कि वे एक विशिष्ट परिदृश्य का परीक्षण करने के लिए एक कार्यात्मक परीक्षण का उपयोग करते हैं। आप एक परिदृश्य परीक्षण में संबंधित परिदृश्य का परीक्षण करने के लिए एक यूनिट परीक्षण का उपयोग कर रहे हैं, यही कारण है कि आपको इसमें उपयोगकर्ता लॉगिन हैक करना था। कृपया अन्य समाधानों पर विचार करें और सही मेनू आइटम के लिए DOM ऑब्जेक्ट को चेक करके इसे कार्यात्मक परीक्षण करें।