सिम्फनी 5 बंडलों के साथ कोड का पुन: उपयोग कैसे करें? भाग 6. परीक्षण

आइए परियोजनाओं के बीच कॉपी-पेस्ट को कैसे रोकें और कोड को फिर से उपयोग करने योग्य प्लग-इन बंडल सिम्फनी में स्थानांतरित करें। 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()
    {
        // TODO: Implement registerBundles() method.
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        // TODO: Implement registerContainerConfiguration() method.
    }
}

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");
    // Assertion on response
    // ...
}

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 के अंदर सूक्ष्म परीक्षण।
रिलीज चक्र, स्थापना और अद्यतन


All Articles