Laravel测试请求 - 服务提供商 - 中间件问题

时间:2018-05-03 15:01:29

标签: laravel laravel-5 laravel-5.5 laravel-dusk

我有一个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,我在那里为Views构建了一些东西。我可以像这样访问$ 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);
    }
}

1 个答案:

答案 0 :(得分:0)

system.cpu.count使用具有方法TestCase的特征MakesHttpRequests。在测试中使用call方法时,它只是一个快捷方式。

在您的测试中,您可以像这样使用它:

get