web-dev-qa-db-ja.com

単体テスト経由でSymfony 2コンテナーにアクセスしますか?

単体テスト内でSymfony 2コンテナーにアクセスするにはどうすればよいですか?私の図書館はそれを必要としているので、それは不可欠です。

テストクラスは\PHPUnit_Framework_TestCaseしたがって、コンテナはありません。

40
Tower

サポートが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 を参照してください。

単体テストでコンテナを使用すると、臭いがすることに注意してください。一般に、クラスはコンテナ全体(全世界)に依存することを意味し、それは良くありません。むしろ、依存関係を制限し、それらをモックする必要があります。

90
Jakub Zalas

セットアップ関数でこれを使用できます

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,);
}
12
Babou34090

アップデート2018:Symfony 3.4/4.0以降、サービスのテストに問題があります。

「プライベートサービスのテスト」と呼ばれ、考えられる解決策は ここで説明


さまざまな異なる構成では、lastzero/test-tools packageも使用します。

それはあなたのためにコンテナをセットアップし、使用する準備ができています:

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);
    }
}
1
Tomáš Votruba