Почему Laravel тесты, созданные с помощью make: test, расширяются из другого TestCase при использовании флага --unit - PullRequest
0 голосов
/ 06 февраля 2020

С помощью Laravel вы можете использовать Artisan для создания тестового класса, используя команду php artisan make:test. При желании флаг --unit может использоваться для создания модульного теста вместо функционального теста.

Недавно мне пришлось написать модульный тест, который требовал некоторой настройки перед выполнением. К сожалению, я столкнулся с ошибкой при попытке использовать фасад: A facade root has not been set.

После некоторого копания я увидел, что тестовый класс, созданный с флагом --unit, простирается от PHPUnit\Framework\TestCase, где есть проверка характеристик простирается от Tests\TestCase. И именно поэтому я не смог использовать фасад, приложение не загружается при использовании тестового класса, сгенерированного с помощью --unit.

Кто-нибудь знает, почему он спроектирован таким образом?

1 Ответ

0 голосов
/ 06 февраля 2020

Обновление:

php artisan make:test

Эта команда создает тест Feature . Функциональный тест обычно используется для проверки интеграции взаимодействующих классов.

php artisan make:test --unit

Эта команда генерирует тест Unit . Модульный тест - это обычно тестирование блоков кода, таких как классы или методы в классах. Модульный тест заменит любые зависимости с помощью Mocks или других тестовых двойников, чтобы класс / функция тестировался изолированно.


Как правило, вы, возможно, захотите «смоделировать» фасад в своих модульных тестах. Вот соответствующая информация из Laravel Документации :

При тестировании Laravel приложений вы можете sh "насмехаться" над некоторыми аспектами вашего приложения, чтобы они фактически не выполняются во время данного теста. Например, при тестировании контроллера, отправляющего событие, вы можете с помощью sh смоделировать прослушиватели событий, чтобы они фактически не выполнялись во время теста. Это позволяет вам проверять только HTTP-ответ контроллера, не беспокоясь о выполнении прослушивателей событий, поскольку прослушиватели событий можно тестировать в их собственном тестовом примере.

Кроме того, здесь приведена документация при макете Cache фасада (в качестве примера):

Мы можем смоделировать вызов к фасаду Cache с помощью метода shouldReceive, который будет возвращать экземпляр макета Mockery. Поскольку фасады фактически разрешаются и управляются сервисным контейнером Laravel, они обладают гораздо большей тестируемостью, чем обычный класс stati c. Например, давайте посмеемся над нашим вызовом метода get фасета Cache:

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Cache;
use Tests\TestCase;

class UserControllerTest extends TestCase
{
    public function testGetIndex()
    {
        Cache::shouldReceive('get')
                    ->once()
                    ->with('key')
                    ->andReturn('value');

        $response = $this->get('/users');

        // ...
    }
}
...