0

我有以下测试用例:

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=databasein .env.testing)并将RefreshDatabase特征导入到我的测试类中。这应该会在测试之间删除数据库,但似乎不是。

当我尝试手动清除队列时,我得到:

Call to undefined method Illuminate\Support\Testing\Fakes\QueueFake::clear()

有没有办法清除setUp方法中的队列?我应该以不同的方式处理这个问题吗?

4

2 回答 2

-1

由于缺少该(重要)部分,因此请确保您同时执行以下操作:

[...] 并且 RefreshDatabase 特征被导入到我的测试类中。

您是只导入它还是同时使用它?您的 TestClass 需要看起来像这样:

<?php

[..]

use Illuminate\Foundation\Testing\RefreshDatabase;

[..]

class YourTest extends TestCase
{
    use RefreshDatabase;

    [..]
   
}
于 2021-06-09T06:54:18.783 回答
-1

我认为你应该使用faker

public function testDontQueueJob(): void
{
    $newNumber = $this->faker->numberBetween(100,999);
    $this->updateModel(["baz" => $newNumber]);
    $this->assertDatabaseHas("models", ["baz" => $newNumber]);
    $this->assertNotPushed(MyJob::class);
}

确保这个条件有效

if ($this->wasChanged("bar")) {
    MyJob::dispatch($model);
}

测试顺序不应影响结果

我还注意到,您在测试中使用键“baz”,在控制器中使用“bar”,对吗?

于 2021-06-09T03:38:28.523 回答