动态路由网址更改未反映在laravel软件包中

时间:2018-09-25 15:28:34

标签: laravel laravel-5 phpunit laravel-routing laravel-testing

我正在创建一个程序包,该程序包提供了一个配置文件以自定义要添加的路由网址,我可以在控制器中看到配置文件的值,但是config('app_settings.url')null相同 pakacge/src/routes/web.php

Route::get(config('app_settings.url'), 'SomeController')

我的测试也给出了404,并且app_settings的配置更改没有被路由选择。

function it_can_change_route_url_by_config() {
  // this should be default url
  $this->get('settings')
    ->assertStatus(200);

  // change the route url
  config()->set('app_settings.url', '/app_settings');

  $this->get('app_settings')
    ->assertStatus(200);

  $this->get('settings')
    ->assertStatus(400);
}

app_setting.php

return [
    'url' => 'settings',
    'middleware' => []
];

当我使用此软件包时,它可以工作,但是测试失败。

请帮助我如何提供从config更改路由网址的选项。

1 个答案:

答案 0 :(得分:1)

说实话,我认为不可能进行这样的测试。我尝试使用一些“ hacky”解决方案,但也失败了。

问题是,当您开始进行此类测试时,所有路由都已加载,因此更改config中的值不会影响当前路由。

编辑

作为替代解决方案,使其在配置中可以测试,我将使用:

<?php

return [
    'url' => env('APP_SETTING_URL', 'settings'),
    'middleware' => []
];

然后在phpunit.xml中进行设置:

<env name="APP_SETTING_URL" value="dummy-url"/>

如您所见,我在这里设置了完全虚拟的url,以确保以后将使用此自定义url,然后进行测试,如下所示:

/** @test */
function it_works_fine_with_custom_url() 
{
    $this->get('dummy-url')
        ->assertStatus(200);

    $this->get('settings')
        ->assertStatus(404);
}

它可能不会测试所有内容,但是很难相信有人会在路由中使用dummy-url,并且在phpunit.xml中使用自定义环境给您带来了一定的信心,只有自定义url可以正常工作;