使用PHPUnit运行Laravel测试,jobs不';如果使用队列连接=';数据库';

使用PHPUnit运行Laravel测试,jobs不';如果使用队列连接=';数据库';,laravel,queue,phpunit,Laravel,Queue,Phpunit,我想在执行由API请求触发的作业时,使用PHPUnit来执行排队作业生命周期 编辑:phpunit.xml <env name="QUEUE_DRIVER" value="database"/> 这将作为pass返回,此处显示的API端点将插入一个测试作业,该作业需要几秒钟才能完成。至少,当前端调用它时,它会这样做。只是不是从PHPUnit来的。我的想法是,我可以添加一些后续的GET调用来测试作业状态监视系统 通过一些日志记录,我可以

我想在执行由API请求触发的作业时,使用PHPUnit来执行排队作业生命周期

编辑:phpunit.xml

    <env name="QUEUE_DRIVER" value="database"/>
这将作为pass返回,此处显示的API端点将插入一个测试作业,该作业需要几秒钟才能完成。至少,当前端调用它时,它会这样做。只是不是从PHPUnit来的。我的想法是,我可以添加一些后续的GET调用来测试作业状态监视系统

通过一些日志记录,我可以看到作业构造函数被调用。没有看到错误,调用返回时数据库中没有作业


将QUEUE_CONNECTION设置为“sync”可以很好地同步执行作业,延迟上述帖子的返回,但这不是我想在这里测试的,我特别想在这里运行整个作业生命周期。或者这是不可能的/不打算这样工作?

您确定正确设置了队列驱动程序吗?我记得我遇到过这样的问题-忘记更改phpunit.xml文件中的队列驱动程序为什么要将其作为
数据库
而不是
同步
?如果您试图通过控制器创建某个对象,并且它触发了一个作业,那么您不必查看该作业是否工作,您必须使用
queue::fake()
伪造队列,然后您可以断言该作业是否已调度,然后创建其他测试,以断言它所做的是否正确。。。请详细解释您到底在做什么,以便我们可以指导您。@matiaslauriti我想运行一个测试,尝试整个作业生命周期,即提交它,在它执行时监视状态,可能包括重试,然后在完成后获取状态。我可以通过一个系统测试来实现这一点,其中像Cypress这样的前端工具从浏览器中练习API。但让后端测试来完成这一切会更加独立。@Dan哦,是的,永远不要使用“外部”触发器来测试后端代码,总是使用后端来测试它。您可以非常轻松地测试作业/队列。您只需确保正在调度,这样就可以断言它已被调度,甚至使用了什么数据。在其他测试(当然是单元测试)中,您测试工作是否正在做您期望它做的事情,如何测试?您只需在测试中分派它,并断言任何预期的数据都已更改,非常简单和直接@matiaslauriti那么,关于为什么作业不能(仅)在PHPUnit环境中调度,有什么想法吗?调用了_construct(),但“jobs”表中没有显示任何内容。
    public function testJobStatusBasic()
    {
        $response = $this->post('/api/jobstatustest');

        $response->assertStatus(200);
        
        $response->assertJson([
            "data" => []
        ]);
    }