【发布时间】:2016-10-01 18:31:09
【问题描述】:
我想通过 Laravel API 上传一个 CSV 文件,然后用 PHPUnit 测试上传。
我在 Controller 中的 store() 函数和 testCreate() 函数基本上是什么样子的。
这是我目前得到的:
<?php
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ProspectListControllerTest extends TestCase
{
use WithoutMiddleware, DatabaseTransactions;
public function testCreate()
{
$file = new Symfony\Component\HttpFoundation\File\UploadedFile(storage_path('/crm/data/test-file.csv'), 'test-file.csv', 'text/plain', 446, null, true);
$this->call('POST', '/api/lists-imports/', [], [], ['csv_file' => $file]);
$this->dump()->assertResponseOk();
}
}
控制器方法如下:
<?php
namespace App\Http\Controllers;
use App\ListImport;
use Illuminate\Http\Request;
class ListImportController extends Controller
{
public $model = ListImport::class;
public function store(Request $request, ListImport $importList)
{
$request->file('importFile')->move(public_path('storage.crm.data'), $request->file('importFile')->getClientOriginalName());
$importList->importFile = public_path('storage.crm.data') . '/' . $request->file('importFile')->getClientOriginalName();
$importList->save();
}
}
任何帮助将不胜感激:)
【问题讨论】:
-
在 testCreate 函数中,您可以将 csv 文件模拟为字符串,而不是上传本身不是吗?我正在处理我在测试用例中制作的 xml 文件
-
store()的单元测试应该涵盖文件是否已存储。更好的测试是assertStringEqualsFile()。第一个参数应该是$importList->importFile,第二个参数应该是$file。此测试将涵盖的不仅仅是响应状态。
标签: php unit-testing laravel csv phpunit