आइए परियोजनाओं के बीच कॉपी-पेस्ट को कैसे रोकें और कोड को फिर से उपयोग करने योग्य प्लग-इन बंडल सिम्फनी में स्थानांतरित करें। 5. बंडल के साथ मेरे अनुभव को सारांशित करने वाले लेखों की एक श्रृंखला, एक न्यूनतम बंडल बनाने से लेकर परीक्षण और बंडल रिलीज चक्र तक एक डेमो एप्लिकेशन को फिर से बनाने तक अभ्यास करेगी।
पिछले भाग में, हमने बंडल कॉन्फ़िगरेशन बनाया । इस लेख में, हम विश्लेषण करेंगे कि बंडल का परीक्षण कैसे करें, कुछ परीक्षण लिखें और उन्हें चलाने के लिए बंडल के अंदर एक माइक्रो एप्लिकेशन बनाएं।
यदि आप ट्यूटोरियल को क्रमिक रूप से पूरा नहीं कर रहे हैं, तो रिपॉजिटरी से एप्लिकेशन डाउनलोड करें और 5-कॉन्फ़िगरेशन शाखा में स्विच करें ।
एक फ़ाइल में प्रोजेक्ट को स्थापित करने और शुरू करने के निर्देश README.md
। आपको 6-परीक्षण शाखा में इस लेख के लिए कोड का अंतिम संस्करण मिलेगा ।
एक बंडल में पोर्टिंग परीक्षण
रिफैक्टरिंग से पहले, 2 परीक्षण पहले से ही लिखे गए थे: सेवाओं में से एक की एक इकाई परीक्षण और नियंत्रक का एक कार्यात्मक परीक्षण।
हमारे पास एक आदिम अनुप्रयोग है जिसमें बुनियादी ढांचे की परत (DB) को डोमेन तर्क से अलग नहीं किया जाता है: परीक्षण एक अस्थायी sqlite डेटाबेस का उपयोग करते हैं।
जांचें कि क्या परीक्षण काम करते हैं:
./vendor/bin/simple-phpunit
Error: Class 'App\Service\EventExporter\Exporters\GoogleCalendarExporter' not found
परीक्षणों ने App\
कोड से शेष नामस्थानों को छोड़ दिया जब तक कि इसे बंडल में स्थानांतरित नहीं किया गया था।
दोनों परीक्षणों में, नाम स्थान को ठीक करें bravik\CalendarBundle
और इसे फिर से चलाएं।
टेस्ट सफलतापूर्वक पास होना चाहिए।
बंडल की जड़ में, एक फ़ोल्डर बनाएं tests
( bundles/CalendarBundle/tests
) और वहां tests/Service
यूनिट टेस्ट फ़ोल्डर को स्थानांतरित करें । हम Controller
थोड़ी देर बाद फ़ोल्डर में कार्यात्मक परीक्षण को स्थानांतरित करते हैं।
एक बंडल से रनिंग यूनिट परीक्षण
परीक्षण चलाने के लिए, हमें बंडल के अंदर PHPUnit स्थापित करने की आवश्यकता है:
cd bundles/CalendarBundle
composer require symfony/phpunit-bridge --dev
यह composer.json
बंडल के लिए एक निर्भरता के रूप में PHP यूनिट को जोड़ेगा , और एक फ़ाइल भी बनाएगा composer.lock
। हमें बंडलों में इसकी आवश्यकता नहीं है: एक .gitignore
फ़ाइल बनाएं और इसे वहां जोड़ें।
बॉक्स के बाहर PHP यूनिट काम नहीं करेगी। आपको इसे कॉन्फ़िगर करने की आवश्यकता है: निर्दिष्ट करें कि परीक्षण कहां झूठ बोलते हैं और संगीतकार ऑटोलैडर को कनेक्ट करते हैं।
- phpunit.xml.dist
.
, Symfony-, 1 bootstrap
:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bin/.phpunit/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="./vendor/autoload.php"
>
bootstrap
composer, PHPUnit .
:
./vendor/bin/simple-phpunit
!
: - .
… ?
.
, 2 .
, — , — -.
.
, ,
-.
- Symfony — Kernel
symfony/http-kernel
.
, , .
. , , Symfony DI-, . symfony/framework-bundle
, http-kernel
.
composer require symfony/framework-bundle
tests/App
TestingKernel
.
Symfony\Component\HttpKernel\Kernel
, :
<?php
namespace bravik\CalendarBundle\Tests\App;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\HttpKernel\Kernel;
class TestingKernel extends Kernel
{
public function __construct()
{
parent::__construct('test', false);
}
public function registerBundles()
{
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
}
}
composer bravik\CalendarBundle\Tests\App
.
: 'test'
, . , .
registerBundles()
. :
public function registerBundles()
{
return [
new CalendarBundle()
];
}
registerContainerConfiguration()
DI-.
.
symfony/router
. , .
. src/Kernel
-:
class Kernel extends BaseKernel
{
use MicroKernelTrait;
protected function configureRoutes(RouteCollectionBuilder $routes): void
{
$routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob');
}
}
, Symfony- «» MicroKernelTrait
.
registerContainerConfiguration()
,
-:
configureContainer()
configureRoutes()
, .
:
TestingKernel
registerContainerConfiguration()
,use MicroKernelTrait;
- .
configureRoutes()
config/routes.yaml
:
protected function configureRoutes(RouteCollectionBuilder $routes)
{
$routes->import(__DIR__.'/../../config/routes.yaml');
}
yaml
, :
composer require symfony/yaml
.
?
tests/Controller/EventControllerTest
.
HTTP . HTTP-. , .
Symfony Request
, . index.php
:
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
, .
, Symfony HttpKernelBrowser
:
composer require symfony/browser-kit --dev
:
public static function createClient()
{
$kernel = new TestingKernel();
return new HttpKernelBrowser($kernel);
}
public function testSomeAction()
{
$client = static::createClient();
$response = $client->request("/some/action");
}
HttpKernelBrowser
. $client->request()
.
, , WebTestCase
, Symfony. createClient()
, , createKernel()
, .
, , — . KERNEL_CLASS
phpunit.xml.dist
:
<php>
<server name="APP_ENV" value="test" force="true" />
<server name="KERNEL_CLASS" value="bravik\CalendarBundle\Tests\App\TestingKernel"
force="true" />
</php>
:
./vendor/bin/simple-phpunit tests/Controller/EventControllerTest.php
...
LogicException: Container extension "framework" is not registered
MicroKernelTrait
. DI- «-», framework
.
FrameworkBundle
. :
public function registerBundles()
{
return [
new FrameworkBundle(),
new CalendarBundle()
];
}
:
InvalidArgumentException: Cannot determine controller argument for "bravik\CalendarBundle\Controller\EditorController::new()": the $entityManager argument is type-hinted with the non-existent class or interface: "Doctrine\ORM\EntityManagerInterface".
- ? EditorController
?
new CalendarBundle()
TestingKernel
, services.yaml
, .
autowiring Symfony . typehints , Symfony typehints .
, , TestingKernel
.
:
composer require doctrine/orm doctrine/doctrine-bundle symfony/twig-bundle
composer require doctrine/doctrine-fixtures-bundle liip/test-fixtures-bundle --dev
TestingKernel
:
public function registerBundles()
{
return [
new DoctrineBundle(),
new DoctrineFixturesBundle(),
new LiipTestFixturesBundle(),
new TwigBundle(),
];
}
: tests/App/config/config.yaml
:
#
# @see https://symfony.com/doc/current/reference/configuration/framework.html#test
framework:
test: true
doctrine:
# SQLITE var/test.db
dbal:
driver: pdo_sqlite
path: "%kernel.cache_dir%/test.db"
# ORM-
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
calendar:
enable_soft_delete: true
services:
# Twig, mock- webpack encore,
#
bravik\CalendarBundle\Tests\App\TwigWebpackSuppressor:
tags: ['twig.extension']
#
bravik\CalendarBundle\Tests\Fixtures\:
resource: '../../Fixtures'
tags: ['doctrine.fixture.orm']
, packages
, . Framework
, Doctrine
, .
TestingKernel
:
protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config.yaml', 'yaml');
}
(!) , , var
Symfony . .gitignore
.
, dev
. - , — !
, - !
, , .
, Symfony - .
आपको 6-परीक्षण शाखा में इस लेख के लिए कोड का अंतिम संस्करण मिलेगा ।
में अगले लेख हम होगा कैसे दर्द और पीड़ा के बिना नया बंडल विज्ञप्ति जारी करने के लिए, कैसे प्रारंभिक स्थापना और बंडल को अद्यतन करने की प्रक्रिया को व्यवस्थित करने के बारे में बात करते हैं।
श्रृंखला के अन्य लेख:
भाग 1. न्यूनतम बंडल
भाग 2. हम कोड और टेम्पलेट्स को बंडल में निकालते हैं।
भाग 3. मेजबान के साथ बंडल का एकीकरण: टेम्पलेट, शैली, JS
भाग 4. बंडल के विस्तार के लिए इंटरफ़ेस
5. पैरामीटर और कॉन्फ़िगरेशन
भाग 6. परीक्षण, बंडल भाग 7 के अंदर सूक्ष्म परीक्षण।
रिलीज चक्र, स्थापना और अद्यतन