0

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

//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();它应该重新读取路由,但它也会重新读取配置。

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

4

2 回答 2

1

如果您将该配置参数的值更改为从环境变量中读取,那么您可以在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);
    }
}

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

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

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

于 2021-12-03T18:28:13.660 回答
0

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

于 2021-09-09T06:59:46.753 回答