Laravel CSV 다운로드 테스트 방법

8610 단어 laravelcsvtest
CSV가 생성되면 실행을 어떻게 테스트합니까? 이 추출물을 섭취하십시오.

public function export()
{
    $actions = $this->getData()->get();

    $columns = [
        'User',
        'Start Date',
        'End Date',
    ];

    $data = [];
    foreach ($actions as $action) {
        $data[] = [
            $action->user->name ?? '',
            $action->due_at,
            $action->completed_at,
        ];
    }

    $now = Carbon::now()->format('d-m-Y');
    $filename = "actions-{$now}";

    return csv_file($columns, $data, $filename);
}


위는 데이터를 수집하여 csv_file이라는 헬퍼 함수로 전송하여 CSV 파일로 내보냅니다.

완전성을 위해 다음을 포함합니다.

if (! function_exists('csv_file')) {
    function csv_file($columns, $data, string $filename = 'export'): BinaryFileResponse
    {
        $file = fopen('php://memory', 'wb');
        $csvHeader = [...$columns];

        fputcsv($file, $csvHeader);

        foreach ($data as $line) {
            fputcsv($file, $line);
        }

        fseek($file, 0);

        $uid = unique_id();

        Storage::disk('local')->put("public/$uid", $file);

        return response()->download(public_path("storage/$uid"), "$filename.csv")->deleteFileAfterSend(true);
    }
}


이제 먼저 확인하고 싶은 테스트가 2개 있습니다. 엔드포인트에서 오류가 발생하지 않도록 200개의 상태 응답을 받고 두 번째로 응답에 CSV용으로 생성된 파일 이름이 포함됩니다.

200 상태 코드를 처리하려면 엔드포인트를 실행하고 assertStatus(200) 대신 200에 대한 바로 가기인 assertOk()를 실행합니다.

다음으로 응답의 헤더를 확인하고 내용 처리 헤더를 읽으십시오. 여기에는 첨부 파일과 파일 이름이 포함됩니다. ** ** assert true를 수행하고 헤더를 예상 응답과 비교합니다.

test('can export actions', function () {
    $this->authenticate();

    $response = $this
        ->get('admin/reports/actions/csv')
        ->assertOk();

    $this->assertTrue($response->headers->get('content-disposition') == 'attachment; filename=actions-'.date('d-m-Y').'.csv');
});


또 다른 방법은 Pest의 expect API를 사용하는 것입니다.

$header = $response->headers->get('content-disposition');
$match = 'attachment; filename=actions-'.date('d-m-Y').'.csv';

expect($header)->toBe($match);

좋은 웹페이지 즐겨찾기