Как я могу протестировать логику второй попытки задания laravel, которая использует функцию попыток

#php #laravel #unit-testing #phpunit #laravel-jobs

#php #laravel #модульное тестирование #phpunit #laravel-jobs

Вопрос:

У меня есть класс заданий в очереди, который экспоненциально отступает благодаря backoff() методу. Я хочу проверить, что backoff() метод работает правильно. Она должна создаваться 2, 4, 8, 16 и так далее после каждой повторной попытки. Поскольку attempts() функция принадлежит InteractsWithQueue черте и считывает количество попыток из RedisJob полезной нагрузки более глубокого decoded класса, я не смог найти правильный способ проверить это.

Любая помощь?

 class AJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;

    public $tries = 10; 

    public function backoff()
    {
        return pow(2, $this->attempts());
    }

    public function handle()
    {
        try{
            //Some logic
        }
        catch(Exception $e){
            $this->release($this->backoff());
        }
    }   
}
 

Ответ №1:

Я решил проблему. Вот решение.

 public function test_backoff_after_fifth_attempt()
    {
        /** @var RedisJob $mockRedisJob */
        $mockRedisJob = $this->mock(
            RedisJob::class,
            function (MockInterface $mock) {
                $mock->shouldReceive('attempts')->once()
                     ->andReturn(5);
            }
        );

        $job = new SendMailJob(new Mail());
        $job->setJob($mockRedisJob);

        $this->assertEquals(32, $job->backoff());
    }