【问题标题】:Testing an Artisan command was queued测试 Artisan 命令已排队
【发布时间】:2021-05-06 23:51:15
【问题描述】:

在某个观察者类中,我有这段代码

//Just for context
public function updated () {
    Artisan::queue('campaign:resume', ['campaignId' => $campaign->id]);
}

目的是在条件满足时测试该命令是否确实在排队。 我尝试了几种方法,但据我所知, Queue::fake() 不会影响 queue 方法,并且似乎无法找到使用 Bus::fake 来断言此排队命令的方法。

这是我测试过的,评论是我尝试过的。再次,观察者的内容被简化,因为它无关紧要。

public function testSomeClassShouldQueueACommand() {
        //Arrange
        //Queue::fake();
        //$fakeBus = Bus::fake();
        $campaignObserver = new CampaignObserver();
        //$this->app->instance(\Illuminate\Foundation\Bus\PendingDispatch::class, $fakeBus);
        //Act
        $campaignObserver->updated();
        //Assert
        //Bus::assertDispatched('campaign:resume');
        //Queue::assertPushed('campaign:resume');
        //Artisan::shouldReceive('queue')->with('campaign:resume');
    }

我看到一些帖子说:只需将其传递给工作或活动并使用Queue::fake/Event::fake。 它的内容不应该在 Job 或 Event 中。如果 Artisan 可以自己处理队列,那么创建一个类来处理命令的“队列”是没有意义的。

关于如何完成这个单元测试有什么想法吗?

【问题讨论】:

    标签: laravel mocking phpunit laravel-6 mockery


    【解决方案1】:

    首先,我假设您将方法称为updated - 有问题的是您展示了update 方法的实现,但您改为调用updated 方法。

    其次,我已经在 Laravel 8 中对其进行了测试,但在 Laravel 6 中应该可以正常工作。

    我认为没有办法使用 Laravel 内置的 fakes 来测试它。

    假设campaign:resume 的命令在App\Console\Commands\TestArtisan 类中。然后你应该可以像这样测试:

    
    $mock = Mockery::mock(\App\Console\Commands\TestArtisan::class . '[handle]')->makePartial();
    $this->instance(\App\Console\Commands\TestArtisan::class, $mock);
    
    $mock->shouldReceive('handle')->once()->withNoArgs();
    
    $campaignObserver = new CampaignObserver();
    
    $campaignObserver->updated();
    
    $this->assertSame([
        'command' => 'campaign:resume',
        'campaignId' => 'HERE_YOU_SHOULD_PUT_SOME_CAMPAIGN_ID',
        0 => 'campaign:resume',
    ], $mock->arguments());
    
    

    因此,您创建了命令的部分模拟,并确保 handle 方法已执行。最后,您可以运行一些额外的断言,例如比较 arguments() 中的数据或您需要的任何其他内容。

    【讨论】:

    • 我明白了。今天晚些时候我会试着搞砸它,谢谢你的提醒
    猜你喜欢
    • 2023-04-02
    • 2014-03-21
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2015-06-30
    • 2017-01-04
    相关资源
    最近更新 更多