在使用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(匹配的数据库变量,并且作业得到了正确处理。