services register create symfony testing service phpunit bundle

register - Pruebas funcionales dentro de un paquete de Symfony2 independiente



symfony phpunit (1)

Aquí está mi propia solución (resumo todo el proceso para probar en un paquete independiente):

1. Primero, un buen paquete tiene su propio composer.json para definir sus dependencias:

{ "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" }

Tenga en cuenta el uso de la dependencia en symfony/framework-bundle que es necesario para nuestras pruebas en los servicios. Ciertamente, puedes disminuir las dependencias al especificar tus propias dependencias reales en el núcleo de Symfony.

Con este archivo puedo procesar el comando (hacerlo) para crear el directorio de proveedores de mi paquete:

$ composer update

2. Luego, puse mi archivo de configuración phpunit:

<!-- 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. Luego, configuré el bootstrap de php para la carga automática de la clase en mi directorio de prueba:

// 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;

Estos pasos son estándar para cualquier prueba en un paquete independiente.

4. Ahora, quiero simular una aplicación para realizar algunas pruebas funcionales en mis servicios:

Necesito una clase de 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''); } }

Y el correspondiente config.yml :

# Tests/config.yml framework: secret: test session: storage_id: session.storage.mock_file my_own: test: 2

Aquí hay un ejemplo con un simulacro para la sesión. No olvide especificar los nodos de configuración de marco correctos si desea tener acceso a algunos servicios (si no especifica la session nodo, por ejemplo, no tiene session servicio).

5. Finalmente, puedo recuperar mis servicios como los siguientes en mis clases de prueba:

// 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()); } }

Necesito hacer algunas pruebas funcionales directamente en un paquete independiente. No quiero probar un controlador, solo una interacción entre servicios reales.

Me gustaría saber si existe una forma estándar / mejor de hacerlo. Lo hice de una manera pero me gustaría saber si hay una mejor.