在测试模式下使用 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) 并且作业得到了正确处理。
在使用 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) 并且作业得到了正确处理。