laravelコントローラでこの機能テストを実行しようとしています。イメージ処理をテストしたいのですが、そうするために、イメージのアップロードを偽造したいと思います。これを行うにはどうすればよいですか?いくつかの例はオンラインですが、どれも私にはうまくいかないようです。
public function testResizeMethod()
{
$this->prepareCleanDB();
$this->_createAccessableCompany();
$local_file = __DIR__ . '/test-files/large-avatar.jpg';
$uploadedFile = new Symfony\Component\HttpFoundation\File\UploadedFile(
$local_file,
'large-avatar.jpg',
'image/jpeg',
null,
null,
true
);
$values = array(
'company_id' => $this->company->id
);
$response = $this->action(
'POST',
'FileStorageController@store',
$values,
['file' => $uploadedFile]
);
$readable_response = $this->getReadableResponseObject($response);
}
ただし、コントローラーはこのチェックに合格しません。
elseif (!Input::hasFile('file'))
{
return Response::error('No file uploaded');
}
したがって、どういうわけかファイルが正しく渡されません。これについてどうすればよいですか?
CrawlerTrait.html#method_actionのドキュメント 読み取り:
パラメーター
string $ method
string $ action
配列$ wildcards
配列$パラメータ
配列$ cookies
配列$ files
アレイ$サーバー
string $ content
だから私は正しい呼び出しが
$response = $this->action(
'POST',
'FileStorageController@store',
[],
$values,
[],
['file' => $uploadedFile]
);
空でないワイルドカードとCookieが必要な場合を除きます。
補足として、これは決してunitテストではありません。
この質問に出くわした誰かのために、あなたは今日これを行うことができます:
$response = $this->postJson('/product-import', [
'file' => new \Illuminate\Http\UploadedFile(resource_path('test-files/large-avatar.jpg'), 'large-avatar.jpg', null, null, null, true),
]);
Phpunitでは、attach()メソッドを使用してファイルをフォームに添付できます。
Lumen docs の例:
public function testPhotoCanBeUploaded()
{
$this->visit('/upload')
->name('File Name', 'name')
->attach($absolutePathToFile, 'photo')
->press('Upload')
->see('Upload Successful!');
}
カスタムファイルでテストする方法の完全な例を次に示します。既知のフォーマットのCSVファイルを解析するためにこれが必要だったので、私のファイルは正確なフォーマットと内容を持っていなければなりませんでした。画像またはランダムなサイズのファイルだけが必要な場合は、$ file-> fake-> image()またはcreate()メソッドを使用します。 Laravelにバンドルされています。
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
class PanelistImportTest extends TestCase
{
/** @test */
public function user_should_be_able_to_upload_csv_file()
{
// If your route requires authenticated user
$user = Factory('App\User')->create();
$this->actingAs($user);
// Fake any disk here
Storage::fake('local');
$filePath='/tmp/randomstring.csv';
// Create file
file_put_contents($filePath, "HeaderA,HeaderB,HeaderC\n");
$this->postJson('/upload', [
'file' => new UploadedFile($filePath,'test.csv', null, null, null, true),
])->assertStatus(200);
Storage::disk('local')->assertExists('test.csv');
}
}
以下は、それに伴うコントローラーです。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class UploadController extends Controller
{
public function save(Request $request)
{
$file = $request->file('file');
Storage::disk('local')->putFileAs('', $file, $file->getClientOriginalName());
return response([
'message' => 'uploaded'
], 200);
}
}
まず必要なものをインポート
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
次に、アップロードする偽のファイルを作成します。
Storage::fake('local');
$file = UploadedFile::fake()->create('file.pdf');
次に、JSONデータを作成してファイルを渡します。例
$parameters =[
'institute'=>'Allen Peter Institute',
'total_marks'=>'100',
'aggregate_marks'=>'78',
'percentage'=>'78',
'year'=>'2002',
'qualification_document'=>$file,
];
次に、データをAPIに送信します。
$user = User::where('email','[email protected]')->first();
$response = $this->json('post', 'api/user', $parameters, $this->headers($user));
$response->assertStatus(200);
うまくいくことを願っています。
同様のsetUp()
メソッドをテストケースに追加します。
protected function setUp()
{
parent::setUp();
$_FILES = array(
'image' => array(
'name' => 'test.jpg',
'tmp_name' => __DIR__ . '/_files/phpunit-test.jpg',
'type' => 'image/jpeg',
'size' => 499,
'error' => 0
)
);
}
これは$ _FILESグローバルを偽装し、Laravelにアップロードされたものがあると考えさせます。