【发布时间】:2018-07-15 21:42:23
【问题描述】:
我正在使用 Larevel 5.5 的内置 Redis 队列。当我编写一个测试队列负载时,我注意到测试无法识别我在queue.php中分配的默认队列名称:
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'tickets',
]
我正在向队列中插入一个有效负载,如下所示:Job::dispacth($payload)。它在实际的非测试代码中按预期工作。
我的测试代码:
public function testTicketQueue()
{
Queue::fake();
$payload = ['this is a ticket'];
TicketProcessor::dispatch($payload)
->onQueue('tickets') // Fails without this
;
Queue::assertPushedOn('tickets', TicketProcessor::class);
}
为什么不将负载发送到
tickets队列?我必须为测试显式分配队列名称。即->onQueue('tickets')。如果它故意忽略它,我在哪里可以找到对这种行为的参考?-
我最终回溯
dispatch()以了解#1 为何如此,但我才发现这是Illuminate\Foundation\Bus\PendingDispatch类的一个奇怪的(参见#3)实例化,如下所示:// Illuminate\Foundation\Bus\Dispatchable public static function dispatch() { return new PendingDispatch(new static(...func_get_args())); } // Illuminate\Foundation\Bus\PendingDispatch public function __construct($job) { $this->job = $job; }dispatch如何将有效负载插入队列?是基于事件的、魔术的还是? new PendingDispatch(new static(...func_get_args()));到底在做什么?具体来说,我不确定new static作为构造函数的参数做了什么。PendingDispatch的构造函数甚至不接受多个参数。
【问题讨论】:
-
你用的是什么测试框架?
-
@btl Laravel 有自己的包装器,但它似乎在下面使用 PHPUnit。
-
对,我没有看到 PHPUnit 标签,只是集成测试。我会为您发布一些信息。
-
检查 phpunit.xml 以查看正在运行的 que 驱动程序。可能不是redis。
标签: laravel testing phpunit integration-testing laravel-5.5