我有以下测试用例:
protected function setUp(): void
{
parent::setUp();
Queue::fake();
}
public function testUpdate(): void
{
$this->updateModel(["foo" => 123]);
$this->assertDatabaseHas("models", ["foo" => 123]);
}
public function testQueueJob(): void
{
$this->updateModel(["bar" => 456]);
$this->assertDatabaseHas("models", ["bar" => 456]);
$this->assertPushed(MyJob::class);
}
public function testDontQueueJob(): void
{
$this->updateModel(["baz" => 789]);
$this->assertDatabaseHas("models", ["baz" => 789]);
$this->assertNotPushed(MyJob::class);
}
只是向updateModel
控制器推送一个发布请求。请求由以下方法处理:
public method update(Request $request, Model $model): JsonResponse
{
$model->update($request->all());
$model->save();
if ($this->wasChanged("bar")) {
MyJob::dispatch($model);
}
return response()->json($model);
}
很明显,我正在测试的是该作业不会被推送到队列中。但是,我的最终测试失败了:
The unexpected [App\Jobs\MyJob] job was pushed.
Failed asserting that actual size 1 matches expected size 0.
我已通过dump()
声明确认在第三次测试期间该工作没有被推动。通过交换第二个和第三个测试,测试套件成功通过,这表明在第二个测试中推入队列的作业已经持续到第三个测试。
我正在使用database
队列驱动程序(QUEUE_CONNECTION=database
in .env.testing
)并将RefreshDatabase
特征导入到我的测试类中。这应该会在测试之间删除数据库,但似乎不是。
当我尝试手动清除队列时,我得到:
Call to undefined method Illuminate\Support\Testing\Fakes\QueueFake::clear()
有没有办法清除setUp
方法中的队列?我应该以不同的方式处理这个问题吗?