【问题标题】:Get Config in Routes tested?测试路由中的配置?
【发布时间】:2021-11-04 20:55:58
【问题描述】:

我需要根据配置使我的路线有条件:

//routes/auth.php

if (config('auth.allow_registration')) {....

以上配置参数是在配置文件中设置的:

//config/auth.php

'allow_registration' => false,

一切正常,直到我尝试对其进行单元测试

public function test_registration_screen_can_be_rendered()
{
    config()->set('auth.allow_registration', true);
    $response = $this->get('/register');

    $response->assertStatus(200);
}

测试用例失败了。

我了解更改配置后,我需要重新读取路由。但是怎么做呢?

我发现只有这个$this->refreshApplication(); 它应该重新读取路由,但它也会重新读取配置。

我怎样才能只重读路由,但保持修改后的配置不变?

【问题讨论】:

  • 发生这种情况是因为当测试开始时,application 已经加载,因此路由已经整理好,您现在无法更改它。你在哪里使用 if ?而且您应该使用env 而不是文字false,因此您可以尝试在setUp 方法上更改它(更改env 值)。但请分享更多信息。
  • 感谢您的介入。if 位于routes/auth.php 文件中
  • 查看refreshApplication()的来源。它在做什么?

标签: laravel phpunit laravel-8 laravel-routing laravel-config


【解决方案1】:

您可以在希望有访问条件的路由上使用中间件。那么您可以在路由或控制器中使用中间件。你可以在 Laravel 良好的文档 here 中了解它。

【讨论】:

  • 这是一个好方法,如果你不希望这些路由是on,你可以返回404
  • 好主意,投了赞成票,但我不能接受这个答案,因为它没有回答我的问题。但是,创建中间件并不是最好的选择。使用控制器构造函数更好,但同样,这不是我所要求的。
【解决方案2】:

如果您将该配置参数的值更改为从环境变量中读取,那么您可以在setUp() 方法中为给定的测试类覆盖它。当 Laravel 读取配置时,它会首先检查该值是否存在环境变量,如果没有则返回默认值。

// config/auth.php

'allow_registration' => env('ALLOW_REGISTRATION', false),
// tests/feature/RegistrationEnabledTest.php

namespace Tests\Feature;

use Tests\TestCase;

class RegistrationEnabledTest extends TestCase
{
    protected function setUp(): void
    {
        putenv("ALLOW_REGISTRATION=true");
        parent::setup();
    }

    public function test_registration_screen_can_be_rendered()
    {
        $response = $this->get('/register');

        $response->assertStatus(200);
    }
}

如果您想为所有您的测试设置它,您可以在 php 环境部分将其添加到您的phpunit.xml

<php>
    <env name="APP_ENV" value="testing"/>
    <env name="ALLOW_REGISTRATION" value="true"/>
</php>

不幸的是,设置 env 仅适用于所有测试或给定的测试类,我也找不到一种方法让它只适用于测试类中的单个测试($this-&gt;refreshApplication() 似乎没有尊重环境变化),并且在运行时手动更改路由不是 Laravel 的设计目的。但是,我认为将各种配置设置的测试分离到离散的测试类中是一种合理的解决方法。

【讨论】:

  • 关于“设置环境仅适用于..给定的测试类”的好主意和非常有用的 cmets。非常感谢。投票赞成。
  • “在运行时手动更改路由并不是 Laravel 的设计初衷”——是的,我们都在推动 Laravel 在各方面更加灵活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多