Тестирование Laravel Inside Legacy Application - PullRequest
0 голосов
/ 27 октября 2018

Вероятность довольно высока, что невозможно помочь мне, если я не смогу увидеть эту кодовую базу, в которой я нахожусь, но я бы хотел спросить здесь на случай, если кто-то сделал что-то подобное ?

Ниже я более подробно расскажу о ситуации, в которой я нахожусь, но основной вопрос, который я задаю: кто-нибудь должен был писать тесты для унаследованной кодовой базы, которая использует Laravel в качестве зависимости, и могли ли вы использовать TestCase от Laravel или вам приходилось играть свою собственную среду тестирования?

Я работаю в более чем 15-летнем устаревшем php-приложении ... Около года назад они начали писать свои новые API в Laravel. Устаревшее приложение включает приложение Laravel в качестве зависимости. Итак, с помощью правила htaccess перезаписи запросы, поступающие на api/v2, попадают в индексный файл, который загружает приложение Laravel. Этот индексный файл включает в себя init.inc.php, который выполняет тонну настройки для унаследованного приложения, затем, когда приложение Laravel загружается, оно фактически загружает пользовательский класс, который расширяет Illuminate\Foundation\Application Laravel. Это происходит потому, что существует множество унаследованных конфигураций, которые передаются в Zend_Config и затем устанавливают каталог хранилища так, чтобы он указывал внутри унаследованного приложения вместо приложения laravel.

Приложение Laravel - это частный упаковщик, который во время разработки получает ссылку на локальную копию репозитория. Во время производства это просто пакет поставщика.

Я пытаюсь настроить тесты на эту чертову штуку ... и она не очень хорошо, лол

Я действительно надеялся, что смогу иметь набор тестов в самом приложении Laravel, но не похоже, что я смогу это сделать, потому что поток начальной загрузки создается в предположении, что унаследованное приложение делает все его настройки до раскрутки Laravel, и, конечно, приложение Laravel также зависит от старого приложения.

Итак, я пытался установить тесты внутри унаследованного приложения и запустить стандартную последовательность загрузки, а затем запустить Laravel. Я действительно могу заставить это работать с классом BaseTestCase extends PHPUnit\Framework\TestCase, и я могу получить экземпляры моих моделей Eloquent внутри теста, я могу поразить конечные точки с помощью Guzzle и утверждать ответы и т. Д. ... все, кажется, работает нормально ?

Проблема в том, что у меня нет простого способа проверить что-либо изолированно на данный момент, поэтому прикосновение к базе данных пока является моим первым методом перехода. Однако у меня также нет простого способа заполнения тестовых данных, и у меня нет простого способа обернуть свои тесты в транзакции, которые откатываются после каждого теста. (Возможно, мне придется идти по этому пути честно, но кажется, что это может привести к большой работе). Что было бы удивительно, если бы я мог просто использовать Illuminate\Foundation\Testing\TestCase, тогда у меня были бы все вкусности Laravel, такие как отсутствие необходимости работать непосредственно с Guzzle для одного, но также такие черты, как DatabaseTransactions и WithoutEvents или WithoutMiddleware и т. д.

Что-то не так, хотя. Когда я пытаюсь расширить Laravel TestCase, я получаю странные ошибки, такие как Argument 1 passed to Illuminate\Database\Eloquent\Model::setEventDispatcher() must implement interface Illuminate\Contracts\Events\Dispatcher, null given,

Погружаясь через некоторый исходный код, похоже, что TestCase проверяет, был ли создан экземпляр app, а если нет, вызывает абстрактный метод createApplication(), который определен в моем пользовательском TestCase, но ошибка, которую я получаю говорит мне, что $app['events'] это null. Тьфу, и, конечно же, я не могу заставить Xdebug работать в их среде, поэтому я не могу должным образом пройти и посмотреть, что именно происходит.

По сути, моя главная цель сейчас - выяснить, как заставить отладку работать с их настройкой, чтобы я мог на самом деле шагать по коду, но я решил задать вопрос здесь, в StackOverflow, на случай, если кто-нибудь посоветует. Все, что приближает меня к возможности использовать Laravel TestCase, было бы поразительным ощущением прямо сейчас.

Я знаю, что это длинный выстрел, но кто-нибудь когда-нибудь пробовал что-то подобное раньше? Удалось ли вам заставить тестовый набор Laravel работать в унаследованном приложении?

Редактировать

Вот как выглядит мое createApplication переопределение после удаления реальных путей с поддельными:

public function createApplication()
{
    @set_include_path(implode(PATH_SEPARATOR, array(
        dirname(__FILE__) . "/../../www-root/core",
        dirname(__FILE__) . "/../../www-root/core/includes",
        dirname(__FILE__) . "/../../www-root/core/library",
        dirname(__FILE__) . "/../../www-root/core/library/vendor",
        get_include_path(),
    )));

    require_once("init.inc.php");

    $this->app = require_once 'private-packagist-package/src/bootstrap/app.php';

    $kernel = $this->app->make(\Illuminate\Contracts\Http\Kernel::class);

    $response = $kernel->handle(
        $request = \Illuminate\Http\Request::capture()
    );

    $response->send();

    $kernel->terminate($request, $response);
}

Тот же самый код работает в моем базовом тестовом примере, где я просто расширяю тестовый пример PHPUnit.

...