Zabawa z PhpUnit i rzucanie Riskami

Zabawa z PhpUnit i rzucanie Riskami
Damian Wasiak
  • Rejestracja:około miesiąc
  • Ostatnio:39 minut
  • Postów:2
0

Witam, po godzinach zacząłem się bawić testami, aby uzupełnić moją wiedzę(nie miałem w mojej 4 letniej karierze backendowca okazji co do tego).
Ale przechodząc do meritum drodzy forumowicze.
Napisałem sobie 2 testy, aby sprawdzić całą mechanikę działania ale na siłe cały czas mi wypluwa 2 warningi(niby wszystko jest okej ale coś tam mu się nie podoba)

Problem to Test code or tested code did not remove its own exception handlers, próbowałem z chatbotem 3h różnymi sposobami zmianami konfiguracji jakimiś metodami czyszczacymi przechwytywanie tych wyjątków i nic. W googlach tez nie znalazłem rozwiązania problemu, miał ktoś już z tym styczność ? Jak coś to symfony 7 i php Unit 11.5 z php 8.2

screenshot-20250406002700.png

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3516
1

Wrzuć kod tych testów.
Możesz też zrobić:

Kopiuj
phpunit --debug
Damian Wasiak
  • Rejestracja:około miesiąc
  • Ostatnio:39 minut
  • Postów:2
0
jurek1980 napisał(a):

Wrzuć kod tych testów.
Możesz też zrobić:

Kopiuj
phpunit --debug
Kopiuj
<?php

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\RawMessage;
use Symfony\Component\Mailer\Envelope;

final class ContactControllerTest extends WebTestCase
{
    protected function setUp(): void
    {
        parent::setUp();
        restore_exception_handler();
        
    }

    public function testInvalidRequestReturnsBadRequest(): void
    {
        $client = static::createClient();
        $client->catchExceptions(false);

        $client->request('POST', '/api/contact', [], [], [
            'CONTENT_TYPE' => 'application/json'
        ], json_encode([
            'name' => '',
            'email' => '',
            'message' => 'short',
        ]));

        $response = $client->getResponse();

        $this->assertSame(400, $response->getStatusCode());
        $this->assertTrue($response->headers->contains('Content-Type', 'application/json'));
        $this->assertJson($response->getContent());

        $data = json_decode($response->getContent(), true);

        $this->assertIsArray($data);
        $this->assertArrayHasKey('status', $data);
        $this->assertArrayHasKey('message', $data);
        $this->assertArrayHasKey('errors', $data);
        $this->assertSame('error', $data['status']);
        $this->assertSame('Formularz zawiera błędy.', $data['message']);
    }

    public function testValidRequestSendsEmail(): void
    {
        $client = static::createClient();
        $client->catchExceptions(false);

        self::getContainer()->set(MailerInterface::class, new class implements MailerInterface {
            public function send(RawMessage $message, ?Envelope $envelope = null): void {}
        });

        $client->request('POST', '/api/contact', [], [], [
            'CONTENT_TYPE' => 'application/json'
        ], json_encode([
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'message' => str_repeat('Message body. ', 5),
        ]));

        $response = $client->getResponse();

        $this->assertSame(200, $response->getStatusCode());
        $this->assertTrue($response->headers->contains('Content-Type', 'application/json'));
        $this->assertJson($response->getContent());

        $data = json_decode($response->getContent(), true);

        $this->assertIsArray($data);
        $this->assertArrayHasKey('status', $data);
        $this->assertArrayHasKey('message', $data);
        $this->assertSame('success', $data['status']);
        $this->assertSame('Wiadomość została wysłana.', $data['message']);
    }


}

Oto cała klasa z testem, tak jak mówiłem testy przechodza ale sa jakieś warningi wiec na moje oko coś z konfiguracją.
Używając phpunit --debug też ładnie przechodzi nie zwraca żadnych błędów, ale tez nie pokazuje informacji o żadnych warningach

jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:3516
0

Deprecated to depracted. Gdzieś wykorzystujesz funkcję która jest już przestarzała.
Test oznaczony jako risky jest kiedy ma np. exit gdzieś w funkcjach i nie jest testowany każdy przypadek. To nie konfiguracja.

edytowany 1x, ostatnio: jurek1980
PA
  • Rejestracja:ponad rok
  • Ostatnio:13 dni
  • Postów:34
1

Na screenie widoczne są dwa uruchmienia PHPUnita:

  1. przy pierwszym lecą komunikaty risky, ale niestety nie widać polecenia, którym testy zostały uruchomione,
  2. przy drugim nie lecą risky, tylko jakieś deprecations, a widoczna linia poleceń wskazuje, że zostało wyłączone zbieranie danych do coverage.

Czy oznacza to, że komunikaty risky lecą tylko wtedy, gdy masz włączone liczenie coverage?

Jeśli tak, to wyłącz coverage na stałe i po sprawie. Możesz to zrobić bez większych obaw o tzw. zgodność ze sztuką, bo pokazane testy są bardziej zbliżone do E2E niż do jednostkowych, a w takim przypadku sensownie jest oceniać pokrycie testami przez mamy 5/5 scenariuszy zamiast przez mamy 80% linii kodu.

Jeżeli nie chcesz wyłączać coverage albo to nie pomoże:

  • spróbuj RunInSeparateProcess,
  • spróbuj WithoutErrorHandler,
  • spróbuj któregoś z obejść wymienionych w https://github.com/symfony/symfony/issues/53812, w szczególności https://github.com/wmde/fundraising-application/pull/3019/files,
  • jak wklejanie obejść na pałę nie pomoże - no cóż, debugger i jazda, sprawdzaj, gdzie handler jest ustawiany i jak temu zapobiec lub jak to odkręcić,
  • opcja IMO najlepsza: przepisz testy tak, aby nie zależały od całej maszynerii frameworka (a tak niestety działa Symfonowy WebTestCase):
    • wariant a) niech testy nie uruchamiają aplikacji, a zamiast tego niech wysyłają żądania do aplikacji już uruchomionej np. w osobnym kontenerze (pójście bardziej w stronę E2E),
    • wariant b) niech testy nie uruchamiają aplikacji, a zamiast tego niech tworzą tylko testowany obiekt ContactController wraz z ewentualnymi zależnościami / mockami (pójście bardziej w stronę klasycznych unitów).

Powodzenia 😉

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.