Symfony PHPUnit self :: $ kernel является нулевым во втором тесте - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь создать тест PHPunit для доступа к сервисам из контейнера в symfony. Для этого я звоню self::bootKernel в setUpBeforeClass. В первом тесте self::$kernel в порядке, но во втором тесте self::$kernel - ноль.

Это простой тест для проверки:

<?php

namespace App\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class KernelTest extends WebTestCase
{
    public static function setUpBeforeClass(): void
    {
        self::bootKernel();
    }

    public function testMethod1(){
        $this->assertNotNull(self::$kernel);
    }

    public function testMethod2(){
        $this->assertNotNull(self::$kernel);
    }
}

. вывод:

$ bin/phpunit tests/KernelTest.php 
PHPUnit 7.5.18 by Sebastian Bergmann and contributors.

Notice: Undefined index: warnings in /app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php on line 334

Warning: Invalid argument supplied for foreach() in /app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php on line 334

Testing App\Tests\KernelTest
.F                                                                  2 / 2 (100%)

Time: 58 ms, Memory: 16.00 MB

There was 1 failure:

1) App\Tests\KernelTest::testMethod2
Failed asserting that null is not null.

/app/tests/KernelTest.php:19

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

Как видите, второй тест не проходит утверждение.

Это версия, которую я использую в phpunit:

phpunit/phpunit                     8.5.2      The PHP Unit Testing framework.
symfony/phpunit-bridge              v5.0.2     Symfony PHPUnit Bridge

Что Я делаю не так? Должен ли я загружать ядро ​​в каждом тесте? Я хотел бы загрузить его только один раз.

1 Ответ

1 голос
/ 29 января 2020

Просто взгляните на определение WebTestCase, например, через GitHub : в его методе tearDown родительский tearDown KernelTestCase (см. GitHub еще раз) вызывается, и это вызывает принудительное отключение ядра. Поскольку tearDown вызывается после каждого отдельного теста, загрузка ядра один раз, прежде чем все остальные тесты, не помогает.

Symfony собственная документация загружает ядро ​​в setUp ( происходит прямо перед каждым отдельным тестовым примером), так что мне это кажется разумным.

Если вы боитесь проблем с производительностью, помните, что такие интеграционные тесты не должны использоваться повсеместно. Следуя обычной пирамиде тестирования, у вас должно быть много модульных тестов (тестирование небольших частей вашего кода изолированно), меньше тестов для связанных классов (где вы могли бы смоделировать различные части) и только несколько тестовых случаев, охватывающих всю систему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...