我正在尝试为我的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
);
}
我的目录结构如下:
看起来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;
}
}
答案 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';
}
...
我注意到我没有使用正确的WebTestCase
,Silex
有自己需要创建应用程序的位置(设置内核):
<?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单元测试的帮助。
干杯, 马克西姆