为什么PHPunit使用Silex要求KERNEL_DIR?

时间:2014-03-04 01:36:56

标签: unit-testing phpunit silex

我正在尝试为我的Silex应用程序设置单元测试,但我不断收到此错误消息:

  

RuntimeException:根据http://symfony.com/doc/current/book/testing.html#your-first-functional-test在phpunit.xml中设置KERNEL_DIR或覆盖WebTestCase :: createKernel()方法。

这是我的./app/phpunit.xml.dist

<?xml version="1.0" encoding="UTF-8"?>

<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    bootstrap="phpunit_bootstrap.php"
>
    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>../src/Acme/*/Tests</directory>
        </testsuite>
    </testsuites>

    <!--<php>-->
        <!--<server name="KERNEL_DIR" value="/var/www/acme/api/app/" />-->
    <!--</php>-->
</phpunit>

这是我的./app/phpunit_bootstrap.php(包括作曲家的自动加载器):

<?php

if (!@include __DIR__ . '/../../vendor/autoload.php') {
    die(<<<'EOT'
You must set up the project dependencies, run the following commands:
wget http://getcomposer.org/composer.phar
php composer.phar install
EOT
    );
}

我的目录结构如下:

Silex application tree structure

看起来phpunit正在寻找*Kernel.php,但我不知道为什么。

这是我的单元测试:

<?php

namespace Acme\User\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class UserControllerTest extends WebTestCase
{
    protected $headers;

    protected function setUp()
    {
        $this->headers = array(
            'CONTENT_TYPE' => 'application/json',
        );
    }

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

        $client->request('POST', ...);

        // Check the response content type
        $this->assertTrue(
            $client->getResponse()->headers->contains(
                'Content-Type',
                'application/json'
            )
        );

        // Assert that the response status code is 2xx
        $this->assertTrue($client->getResponse()->isSuccessful());

        $response = json_decode($client->getResponse()->getContent(), true);

        var_dump($response);die;
    }
}

1 个答案:

答案 0 :(得分:4)

好的,

我设法让它发挥作用。我有几个配置问题。

app/phpunit_boostrap.php中的第一个,我添加了:

<?php

$_SERVER['env'] = 'test';
...

然后在我的web/index.php我添加了:

// Return the kernel instead to run it if we are unit testing
if ('test'  == $app['mode']) {
    return $app;
}

$app->run();

然后在我的app/application.php中,我添加了:

...
// Set dev mode for unit testing
if (isset($_SERVER['env']) && 'test' === $_SERVER['env']) {
    $app['mode'] = 'test';
}
...

我注意到我没有使用正确的WebTestCaseSilex有自己需要创建应用程序的位置(设置内核):

<?php

namespace Acme\User\Tests\Controller;

// Notice the Silex class for the WebTestCase
use Silex\WebTestCase;

class UserControllerTest extends WebTestCase
{
    protected $headers;

    public function createApplication()
    {
        // index.php should return the $app instead to run() it
        return require __DIR__ . '/../../../../../web/index.php';
    }

    protected function setUp()
    {
        // Don't forget to call the parent setup that is setting the kernel
        parent::setUp();
        $this->headers = array(
            'CONTENT_TYPE' => 'application/json',
        );
    }

    public function testAuthUser()
    {
        // Create a client this way
        $client = $this->createClient();

        $client->request('POST', ...);

现在一切都很顺利。另外,我创建了自己的WebTestCase类,扩展了Silex中的一个,这样我就不必一直设置应用程序。

我希望这会对你们中的一些人有所帮助,因为我没有找到任何关于Silex单元测试的帮助。

干杯, 马克西姆