Запрос на тестирование Laravel — поставщик услуг — проблема промежуточного программного обеспечения

У меня есть приложение Laravel 5.5, в котором у меня есть поставщик услуг, который я использую для добавления некоторых вещей в атрибуты request- > для доступа к нему везде (упрощенно):

    namespace App\Providers;

    use App\Models\Domain;
    use Illuminate\Http\Request;
    use Illuminate\Support\ServiceProvider;

    class GlobalVarsServiceProvider extends ServiceProvider
    {
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }

        /**
         * Bootstrap the application services.
         *
         * @param Request $request
         *
         * @return void
         */
        public function boot(Request $request)
        {
            $domain = .. get domain with language and  some logic and cache because of multiple domains ..
            $request->attributes->add(['domain' => $domain]);
        }
    }

Я делаю это в поставщике услуг, потому что тогда я уже могу использовать его в других поставщиках услуг, таких как мой ViewComposerServiceProvider, где я сочиняю некоторые вещи для представлений. Я могу получить доступ к $domain везде следующим образом:

$this->domain = $request->attributes->get('domain');

Это прекрасно работает. НО не в тестировании. Когда я хочу получить доступ к $domain в модульном тесте в промежуточном программном обеспечении, атрибуты $request-> пусты (в UnitTests, как и в DuskTests).

Похоже, что среда тестирования использует другой жизненный цикл запроса? Если да, то что еще изменилось в тестовой среде?

Что я делаю не так?

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

Пример теста:

namespace Tests\Feature;

use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

person ndberg    schedule 03.05.2018    source источник
comment
Не могли бы вы поделиться фрагментом вашего теста? в частности код, который подделывает/вызывает http-запрос   -  person Quezler    schedule 03.05.2018
comment
Это работает, когда вы заходите на сайт в браузере, но не с Dusk?   -  person Jonas Staudenmeir    schedule 04.05.2018
comment
Джеп, без проблем..   -  person ndberg    schedule 04.05.2018


Ответы (1)


TestCase использует трейт MakesHttpRequests, у которого есть метод call. Когда вы используете метод get в своих тестах, это просто ярлык для этого.

В своем тесте вы можете использовать его следующим образом:

$this->call('GET', '/url/here', $yourRequestParametersHere);
person Lance Pioch    schedule 03.05.2018
comment
Хм, я думаю, что я делаю так: $response = $this-›get('/'); ? - person ndberg; 03.05.2018