ソムリエでエンジニアのブログ

ワインの事も書きたいけど基本エンジニア用

Laravelで用意したファイルを使ってテストする

はじめに

CTIのサービスに携わっている為、音声ファイル関連の機能に関わる事が多く自動テストで音声ファイルを扱う機能をカバーしたいと考えていました。


初期実装では、UploadedFile::fake()を利用して以下のようにダミーデータ作り対応していました。

<?php

use Illuminate\Http\UploadedFile;


$record_file = UploadedFile::fake()->create(
    name: 'record-file-sample.wav',
    mimeType: 'audio/x-wav'
 );

しかしダミーデータでは、ファイルサイズチェックなどの一部メソッドのテストが上手くいかなかった為(この辺りの調査は必要かもしれない)、自分で用意したテストデータを持つファイルをPOSTする方法を調べたのでまとめておきます。

環境

Laravel8系

実装方法

1, テスト用の音声ファイルを用意する

今回はテスト用データとして利用する場面が多くなる事を想定し、テスト用ファクトリディレクトリを作成。そこに該当データを置きます。


f:id:sommelierEngineer:20220130082441p:plain

2, Illuminate\Http\UploadedFileオブジェクトを生成

<?php
use Illuminate\Http\UploadedFile;


dummy = new UploadedFile(
    './tests/Factory/File/sample-test.wav',
    'record-file-sample.wav',
    'audio/x-wav',
    null,
    true,
);


補足

UploadFileのコンストラクタ引数についても確認しておきたいと思います。
このクラスはSymfony\Component\HttpFoundation\File\UploadedFileクラスを継承しているのでそちらを見るとコンストラクタが書かれています。

<?php

    /**
     * @param string  $path  ファイルへのパス
     * @param string  $originalName アップロードされたファイルのオリジナルファイル名
     * @param string|null $mimeType  PHP が提供するファイルの型。
     * @param int|null  $error  アップロード時のエラー定数 
     * @param bool        $test        テストモードが有効かどうか
     */
    public function __construct(string $path, string $originalName, string $mimeType = null, int $error = null, bool $test = false)
    {
        ...}

参考

stackoverflow.com