在测试模式下使用 exec 处理 queue:work - Laravel

handle queue:work using exec in test mode - Laravel

在使用 PHPUnit 的测试模式下,我在外部处理队列中的作业时遇到问题。我有一项工作是将一条消息写入日志文件,当我访问一条路线时,它会被调度,我认为它可以像在开发中那样工作,那里有一个终端 window 正在监听 php artisan queue:work 和另一个 运行 服务器。

Test.php

public function testBasicTest()
{
    $message = "Sample message job " . date("l jS \of F Y h:i:s A");
    $filename = "laravel.log";
    $this->json('GET', route('test.test-try-log-job'), ['message' => $message]);
    $this->assertDatabaseHas('jobs', [
        'id' => 1,
    ]);

    exec('php artisan queue:work');  // Artisan::call("queue:work");

}

控制器

class TestController extends Controller
{
    public function tryLogJob(Request $request){
        dispatch(new TestJob($request->message))->onQueue('default');
        return response()->json(['success'=>true], Response::HTTP_OK);
    }
}

工作

class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    public $message;
    public function __construct($message)
    {
        $this->message = $message;
    }
    
    public function handle()
    {
        Log::info($this->message);
        sleep(5);
    }
}

当我使用 Artisan::call("queue:work"); 时,作业已处理,但当我使用 exec('php artisan queue:work'); 时,作业未处理。

有什么方法可以让它发挥作用吗?我真的需要使用 exec() 功能。

phpunit.xml 配置为 SQLite,但 .env 文件配置为 MySQL。

在测试期间,作业被添加到 SQLite 而不是 MySQL,其中 exec('php artisan queue:work'); 是 运行。

我在 phpunit.xml 中设置了数据库变量以匹配那些 .env (MySQL) 并且作业得到了正确处理。