句柄队列:在测试模式下使用exec-Laravel



在使用PHPUnit的测试模式下,我在外部处理队列上的作业时遇到问题。我有一项工作,它会向访问路由时发送的日志文件写入消息,我认为它可以像开发中那样工作,其中有一个终端窗口在侦听php artisan queue:work和其他运行服务器的工作。

测试.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,而不是运行exec('php artisan queue:work');的MySQL。

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

最新更新