Ecco la mia soluzione (riassumo tutto il processo per il test in un fascio standalone):
1. In primo luogo, un buon pacchetto ha un proprio composer.json
per definire le sue dipendenze:
{
"name": "my/own-bundle",
"type": "symfony-bundle",
"description": "Symfony2 bundle that provides ...",
"keywords": ["my","own"],
"license": "MIT",
"authors": [
{
"name": "John Doe",
"email": "[email protected]"
}
],
"require": {
"php": ">=5.3.2",
"symfony/framework-bundle": ">=2.3"
},
"require-dev": {
"phpunit/phpunit": "3.7.*"
},
"autoload": {
"psr-0": { "My\\OwnBundle": "" }
},
"target-dir": "My/OwnBundle",
"minimum-stability": "dev"
}
Nota l'uso della dipendenza su symfony/framework-bundle
che è necessario per i nostri test sui servizi. Certamente puoi ridurre le dipendenze specificando le tue reali dipendenze sul nucleo di symfony.
Con questo file posso elaborare il comando (farlo) per costruire la cartella vendor del mio pacco:
$ composer update
2. Poi, ho impostato il mio phpunit file di configurazione:
<!-- phpunit.xml.dist -->
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="Tests/bootstrap.php"
>
<testsuites>
<testsuite name="MyOwnBundle Test Suite">
<directory>./Tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./</directory>
<exclude>
<directory>./Resources</directory>
<directory>./Tests</directory>
<directory>./vendor</directory>
</exclude>
</whitelist>
</filter>
</phpunit>
3. Poi, ho impostato il bootstrap php per il caricamento automatico della classe nella mia directory di test:
// Tests/bootstrap.php
$file = __DIR__.'/../vendor/autoload.php';
if (!file_exists($file))
{
$file = __DIR__.'/../../../../../../vendor/autoload.php';
if (!file_exists($file))
throw new RuntimeException('Install dependencies to run test suite.');
}
$autoload = require_once $file;
Questi passaggi sono standard per qualsiasi test in un pacchetto standalone.
4. Ora, voglio simulare una richiesta per fare alcuni test functionnal sui miei servizi:
Ho bisogno di una classe di kernel:
// Tests/AppKernel.php (you can define it in a subdirectory /Fixtures if you prefer)
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array();
if (in_array($this->getEnvironment(), array('test'))) {
$bundles[] = new Symfony\Bundle\FrameworkBundle\FrameworkBundle();
$bundles[] = new My\OwnBundle\MyOwnBundle();
}
return $bundles;
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config.yml');
}
}
e il corrispondente config.yml
:
# Tests/config.yml
framework:
secret: test
session:
storage_id: session.storage.mock_file
my_own:
test: 2
Ecco un esempio con una simulazione per la sessione. Non dimenticare di specificare i nodi di configurazione del framework corretto se si desidera avere accesso ad alcuni servizi (se non si specifica il nodo session
, ad esempio non si dispone del servizio session
).
5. Infine, posso recuperare i miei servizi come la seguente nei miei corsi di prova:
// Tests/Functional/Handling/Handler.php
namespace My\OwnBundle\Tests\Functional\Handling;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class HandlerTest extends WebTestCase
{
private $handler;
protected function setUp()
{
require_once __DIR__.'/../../AppKernel.php';
$kernel = new \AppKernel('test', true);
$kernel->boot();
$container = $kernel->getContainer();
$this->handler = $container->get('my_own.handling.handler');
}
public function testHandle()
{
$this->assert($this->handler->handle());
}
}
possibile duplicato (http [Come faccio a testare un servizio in Symfony2?]: // StackOverflow. it/questions/17798143/how-can-i-test-a-service-in-symfony2) –
No, non voglio eseguire i test del pacchetto all'interno di un'applicazione. – Gnucki
Ho dato la mia soluzione in una risposta. È un po 'lungo che è uno dei motivi per cui non l'ho messo nella mia domanda. – Gnucki