laravel 如何在所有测试之前执行一次命令?

mpbci0fu  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(129)

我正在寻找一个解决方案来清除Laravel中的缓存,在开始所有测试之前(请注意,我指的是所有测试,而不是每一个测试):

$this->artisan('cache:clear');
    $this->artisan('route:clear');
    $this->artisan('config:clear');

Laravel 9和PHPUnit 9.5

ars1skjm

ars1skjm1#

据我所知,没有这样的方法来做到这一点,因为这不是单元测试的范围。
单元测试旨在为每个测试设置相同的环境,所有测试的环境不是其责任。
但是您仍然可以通过创建一个自定义命令来调用config:cleartest

1.自定义命令。

php artisan make:command test

2.编辑测试命令。

默认路径为app/Console/Commands/test.php

...
/**
 * Execute the console command.
 */
public function handle()
{
    $this->call('cache:clear');
    $this->call('route:clear');
    $this->call('config:clear');
    $this->call('test');
}

3.通过自己的test命令调用单元测试。

如果您没有更改默认的$signature,则app:test将是您刚刚创建的默认命令。
运行php artisan app:test调用单元测试。

5sxhfpxr

5sxhfpxr2#

添加

protected function setUp(): void
{
    parent::setUp();
    $this->artisan('cache:clear');
    $this->artisan('route:clear');
    $this->artisan('config:clear');
}

在tests/TestCase.php

m3eecexj

m3eecexj3#

您可以通过创建自己的TestCase(或编辑原始的TestCase,php)并将这些任务添加到createApplication方法中来完成此操作:

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Artisan;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
        
        Artisan::call('cache:clear');
        Artisan::call('route:clear');
        Artisan::call('config:clear');

        return $app;
    }
}

每个测试都应扩展此TestCase,而不是Illuminate\Foundation\Testing\TestCase
你也可以考虑在你的开发环境中不缓存路由和配置。在phpunit.xml中,你也可以将测试期间使用该高速缓存驱动程序设置为与开发期间使用的不同的驱动程序,例如:

<phpunit 
    ...>
    ...
    <php>
        ...
        <env name="CACHE_DRIVER" value="array"/>
        ...
    </php>
</phpunit>

这样就不必在运行测试之前清除缓存。
this answer中,你可以阅读更多关于测试期间配置缓存的内容。在那里,你还可以找到一个GitHub问题的链接,该问题讨论了在运行测试之前清除缓存。

相关问题