如何在 Laravel 中测试文件上传?

Laravel

在本教程中,我们将了解到如何使用 Laravel 测试文件上传。我们将创建一个非常简单的表单来上传文件。此外,我们还将使用 Laravel 测试文件上传。

创建一个新视图

让我们先创建一个简单的视图。在 resources/views 目录中创建一个名为 upload.blade.php 文件。将以下内容复制至 upload 视图中。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <form action="/upload" method="post" enctype="multipart/form-data">
        {{ csrf_field() }}
        <input type="file" accept="image/*" name="file">

        <button type="submit">Submit</button>
    </form>

</body>
</html>

路由

routes/web.php 文件中添加以下两个路由。

Route::get('/upload', 'UploadController@index');
Route::post('/upload', 'UploadController@store');

一个路由将用于显示表单,另外一个路由将用于处理上传。

应用程序逻辑

运行以下命令创建一个上传控制器。

php artisan make:controller UploadController

迁移文件

让我们为上传文件创建一个新的迁移文件和模型。运行以下命令来创建 Upload 模型和迁移文件。

php artisan make:model Upload -m

打开 database/migrations  目录下的 create_uploads_table.php 文件,将 up 方法替换为下面所写的内容。

Schema::create('uploads', function (Blueprint $table) {
    $table->increments('id');
    $table->string('file');
    $table->timestamps();
});

我们将已上传文件的路径保存在 file 列中。

Upload 模型

打开 Upload 模型,添加以下内容以避免出现大规模赋值异常。

protected $guarded = [];

在实际的应用程序中,你更愿意使用 $fillable 属性。

Upload 控制器

现在,将以下内容复制至 UploadController.php 文件中。

<?php

namespace App\Http\Controllers;

use App\Upload;
use Illuminate\Http\Request;

class UploadController extends Controller
{
    public function index()
    {
        return view('upload');
    }

    public function store(Request $request)
    {
        Upload::create([
            'file' => $request->file('file')->store('file', 'public')
        ]);

        if ($request->wantsJson()) {
            return response([], 204);
        }

        return back();
    }
}

在 index 方法中,我们简单的将视图返回。在 store 方法中,我们将上传文件的名称存储至数据库中。$request->file('file')->store('file', 'public') 返回哈希文件名,同时将文件存储至磁盘上。

我们的后台逻辑已经完成。

测试文件上传

让我们言归正传:测试文件上传。运行以下命令来创建一个新的功能测试。

php artisan make:test UploadTest

在 tests/Feature 目录中打开 UploadTest.php 文件,将文件中的内容替换为以下内容。

<?php

namespace Tests\Feature;

use App\Upload;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;

class UploadTest extends TestCase
{
    /** @test */
    function upload_file_test()
    {
        Storage::fake('public');

        $this->json('post', '/upload', [
            'file' => $file = UploadedFile::fake()->image('random.jpg')
        ]);

        $this->assertEquals('file/' . $file->hashName(), Upload::latest()->first()->file);

        Storage::disk('public')->assertExists('file/' . $file->hashName());
    }
}

upload_file_test 中,首先我们简单的调用 Storage::fake('public'); ,它将用一个名为 public 的本地测试磁盘替换为给定的磁盘。

在下一行中,我们将一个 post 请求推送至 /upload 路由,这将调用 Upload 控制器中的 store 方法。我们使用 UploadedFile::fake()->image('random.jpg') 创建一个名为 random.jpg 的伪图片。Laravel 实际上创建一个新的黑色图片并将其保存在 PHP temp 目录下。如果需要,你还可以将宽度和高度传给 image 方法,默认为 10 * 10 。如果设置了最小宽度和高度的验证,则可以传递这些参数。

接下来,我们检查在数据库中是否存在该文件名称。它只是在数据库中查找最新记录,并检查其文件属性是否等于文件的哈希名称。

最后,我们检查在第一步中通过调用 fake 方法,创建在公共磁盘上的文件是否存在。

这就是用 Laravel 测试上传文件所需的全部内容,希望它能对你的项目有所帮助。


Practice makes perfect.

原文地址:https://tutsforweb.com/testing-file-uplo...

译文地址:https://learnku.com/laravel/t/27955

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会