質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.05%

Laravel5.6 画像アップロードのテスト

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,511

nezuko

score 12

 前提・実現したいこと

画像アップロード(基本)
こちらを参考に、名前を入力して画像を選択→確認→アップロード完了 という流れで画像をアップロードして一覧表示させるプログラムを作成しました。

実行するとダミーの画像をアップロードできるようなテストを作りたいのですが、イマイチどうすれば良いのかわかりません。

 発生している問題・エラーメッセージ

UploadedFileを用いてダミー画像の作成はできたのですが、その後それをどうアップロードさせれば良いのかがわからず詰まっています。

 該当のソースコード

<?php

namespace Tests\Feature\Test;

use Tests\TestCase;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\ImageUploadRequest;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;

class FeatureTest extends TestCase
{

    /**
     * アクセス表示確認
     * @return void
     */
    public function testCanView()
    {
       //フェイクデータ作成 
        $upload = factory("App\Http\Model\ImageUploadDAO")->create();

        //indexにアクセスすると
        $response = $this->get("/upload");

        //アップロードした画像の一覧とタイトルが見える
        $response->assertSee($upload->tbody)
                 ->assertSee($upload->title);

        //確認画面
         $response = $this->get("/upload/config");
         $response->assertSee($upload->body)
                  ->assertSee($upload->title);

        //完了画面
        $response = $this->get("/upload/finish");
        $response->assertSee($upload->body)
                 ->assertSee($upload->title);
    }

    public function testUpload()
    {

        $request =new \App\Http\Requests\ImageUploadRequest;
        //フェイクディスクの作成
        //strage/framework/testing/disks/image に保存
         Storage::fake('design'); 

        //UploaderFile
        $file = UploadedFile::fake()->image("thum.jpg","150","150");

        //とりあえず直接DBにユーザーネーム追加
        $uploader = new \App\Http\Model\ImageUploadDAO;
        $uploader->user_name = "hoge";
        $uploader->save();
        // レコードを挿入したときのIDを取得
        $lastInsertedId = $uploader->id;

        $confirm = new \App\Http\Controllers\ImageUploadController;
        $confirm->confirm($request);

        //画像を移動
        $file->move(public_path() . "/img/upload/".$lastInsertedId,"thum.jpg");


        $response = $this->json(
            "POST",
            "/upload/confirm",
            [
                "thumbnail" => $file,
            ]);
    }   
}
<?php

namespace App\Http\Logic;

use Illuminate\Http\Request;

class ImageUploadLogic extends \App\Http\Logic\BaseLogic{

    //出力(index)
    public function getIndex()
    {
        $uploader =\App\Http\Model\ImageUploadDAO::orderBy("created_at", "desc")->paginate(5);
        $imageArray = array(
            "uploaders" => $uploader,
        );
        return $imageArray;
    }

     //確認(confirm)
    public function tmpUpload(\App\Http\Requests\ImageUploadRequest $request)
    {
        $userName = $request->userName;
        $thumbnailName = uniqid("THUMBNAIL_") . "." . $request->file("thumbnail")->guessExtension(); // TMPファイル名
        $request->file("thumbnail")->move(public_path() . \Config::get("fpath.tmp"), $thumbnailName);
        $thumbnail = \Config::get("fpath.tmp").$thumbnailName;

        $thumbnailAndUserNameArray = array(
            "thumbnail" => $thumbnail,"userName" => $userName,
        );

        return $thumbnailAndUserNameArray;
    }

    //完了(upload)
    public function upload(Request $request)
    {
        $uploader = new \App\Http\Model\ImageUploadDAO;
        $uploader->user_name = $request->userName;
        $uploader->save();

        // レコードを挿入したときのIDを取得
        $lastInsertedId = $uploader->id;

        // ディレクトリを作成
        if (!file_exists(public_path() .\Config::get("fpath.thum") . $lastInsertedId)) 
            mkdir(public_path() . \Config::get("fpath.thum") . $lastInsertedId, 0777);

        // 一時保存から本番の格納場所へ移動
        rename(public_path() . $request->thumbnail, public_path() . \Config::get("fpath.thum").$lastInsertedId . "/thum." .pathinfo($request->thumbnail, PATHINFO_EXTENSION));
    }
}
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateMUploadersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create("m_uploaders", function (Blueprint $table) {
            $table->increments("id");
            $table->string("user_name")->comment("名前");
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists("m_uploaders");
    }
}

 試したこと

意外と簡単だったLaravelで画像アップロードテスト
Laravelで始めるTDD開発 (1):簡単なテストコードを書く
こちらを参考にして書いてみたのですが、肝心のアップロードの部分がわからず…。
今はとりあえず直接データベースにユーザーネームを追加して、アップロード先のフォルダに作成したダミー画像を移動させて無理矢理表示させていますが、多分こういうことじゃないよなぁと思いつつ他に方法が全く思いつかず詰まっております。
初心者のためわからないことばかりですが、ご教授の程、どうぞ宜しくお願い致します。

 補足情報(FW/ツールのバージョンなど)

Laravel5.6
PHP7.2
CentOS7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

fakerやら色々使ってなんとか自己解決しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る