2012-01-23 50 views
34

如何在單元測試中訪問Symfony 2容器?我的圖書館需要它,所以它是至關重要的通過單元測試訪問Symfony 2容器?

測試類延伸\PHPUnit_Framework_TestCase所以沒有容器。

+1

http://stackoverflow.com/questions/7004601/symfony2-testing-entity-validation-constraints/7016258#7016258 – JamesHalsall

回答

82

Symfony現在支持。見http://symfony.com/doc/master/cookbook/testing/doctrine.html

這裏是你能做什麼:

namespace AppBundle\Tests; 

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; 

class MyDatabaseTest extends KernelTestCase 
{ 
    private $container; 

    public function setUp() 
    { 
     self::bootKernel(); 

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

對於有點更現代和可重複使用的技術看https://gist.github.com/jakzal/a24467c2e57d835dcb65

請注意,在單元測試中使用容器聞起來。一般來說,這意味着你的課程取決於整個容器(整個世界),這並不好。你應該限制你的依賴並嘲笑它們。

+23

+1提到代碼味道。 – gilden

+9

可能更好:http://symfony.com/doc/master/cookbook/testing/doctrine.html – binarious

12

你可以利用這一點,在你的設置功能

protected $client; 
protected $em; 

/** 
* PHP UNIT SETUP FOR MEMORY USAGE 
* @SuppressWarnings(PHPMD.UnusedLocalVariable) crawler set instance for test. 
*/ 
public function setUp() 
{ 
    $this->client = static::createClient(array(
      'environment' => 'test', 
    ), 
     array(
      'HTTP_HOST' => 'host.tst', 
      'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0', 
    )); 

    static::$kernel = static::createKernel(); 
    static::$kernel->boot(); 
    $this->em = static::$kernel->getContainer() 
           ->get('doctrine') 
           ->getManager(); 
    $crawler = $this->client->followRedirects(); 
} 

不要忘記設置你的拆解功能

protected function tearDown() 
{ 
    $this->em->close(); 
    unset($this->client, $this->em,); 
} 
+0

應該選擇此評論。謝謝你,先生! – DanR

-1

出於各種不同的configs你也可以使用lastzero/test-tools

它設置容器爲你準備使用:

use TestTools\TestCase\UnitTestCase; 

class FooTest extends UnitTestCase 
{ 
    protected $foo; 

    public function setUp() 
    { 
     $this->foo = $this->get('foo'); 
    } 

    public function testBar() 
    { 
     $result = $this->foo->bar('Pi', 2); 
     $this->assertEquals(3.14, $result); 
    } 
}