如何编写带有DI的控制器中方法的测试?

问题描述

我有可渲染的控制器,用于渲染一些pdf。在路由中,我只需要传递一些字符串作为参数,我的方法如下所示:

public function __invoke(
        Request $request,IncidentPdfGenerationService $incidentPdfGenerationService,string $report
    ) {
        $pdf = $incidentPdfGenerationService->getRawPdf($request,$report);
        $name = $report . '.pdf';

        return $pdf->stream($name);
    }

这就是我所拥有的:

/** @test */
    public function generate_incidents_pdf()
    {
        $this->user->syncRoles(['system admin','field manager','field officer','reports admin']);

        $this->actingAs($this->user);

        $this->mock(IncidentPdfGenerationService::class,function ($mock) {
            $mock->shouldReceive('getRawPdf')->once();

            $mock->getRawPdf(request(),'pdf-report');

            $url = route('incidents.generate-pdf',['pdf-report']);

            $response = Http::get($url);

            $response->ok();
        });
    }

IncidentPdfGenerationService一个接口,我将其绑定到服务提供商中。如何编写仅使用assertStatus(200)来检查此路由的测试?

解决方法

在测试服务或类似服务时,您应该尝试不必创建任何依赖关系。我建议使用Mockery来完成此操作,因为您可以创建IncidentPdfGenerationService依赖项的虚拟版本。