Метод upload
Метод upload класса Testable используется в тестах для симуляции загрузки файла в компонент Livewire. Он принимает имя свойства компонента, которое должно быть помечено атрибутом #[Validate] или #[Rule] для валидации, и экземпляр загружаемого файла. Этот метод позволяет протестировать логику обработки файлов без необходимости реальной загрузки через веб-интерфейс.
Метод возвращает экземпляр Testable для цепочки вызовов.
Синтаксис
$livewire->upload('propertyName', $uploadedFile);
Пример
Давайте создадим компонент для загрузки аватара и протестируем его:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\WithFileUploads;
use Livewire\Attributes\Rule;
class AvatarUpload extends Component
{
use WithFileUploads;
#[Rule('required|image|max:1024')]
public $avatar;
public function uploadAvatar()
{
$this->validate();
// Логика сохранения файла
// $path = $this->avatar->store('avatars', 'public');
session()->flash('message', 'Avatar uploaded successfully!');
}
public function render()
{
return view('livewire.avatar-upload');
}
}
?>
<div>
<form wire:submit="uploadAvatar">
<input type="file" wire:model="avatar" />
@error('avatar')
<span>{{ $message }}</span>
@enderror
<button type="submit">Upload</button>
</form>
@if (session()->has('message'))
<div>{{ session('message') }}</div>
@endif
</div>
Теперь напишем тест для этого компонента с использованием метода upload:
<?php
namespace Tests\Feature\Livewire;
use App\Livewire\AvatarUpload;
use Illuminate\Http\UploadedFile;
use Livewire\Livewire;
use Tests\TestCase;
class AvatarUploadTest extends TestCase
{
public function test_avatar_upload_successfully()
{
$file = UploadedFile::fake()->image('avatar.jpg');
Livewire::test(AvatarUpload::class)
->upload('avatar', $file)
->call('uploadAvatar')
->assertHasNoErrors('avatar')
->assertSee('Avatar uploaded successfully!');
}
public function test_avatar_upload_validation_fails()
{
$file = UploadedFile::fake()->create('document.pdf', 1000);
Livewire::test(AvatarUpload::class)
->upload('avatar', $file)
->call('uploadAvatar')
->assertHasErrors('avatar');
}
}
?>
В первом тесте мы имитируем загрузку изображения, вызываем метод uploadAvatar и проверяем отсутствие ошибок и наличие сообщения об успехе. Во втором тесте мы загружаем неподходящий файл и проверяем наличие ошибок валидации.
Пример
Метод upload также может использоваться для тестирования нескольких файлов, если свойство компонента является массивом:
<?php
namespace App\Livewire;
use Livewire\Component;
use Livewire\WithFileUploads;
use Livewire\Attributes\Rule;
class FileUpload extends Component
{
use WithFileUploads;
#[Rule('required|array|max:3')]
#[Rule('files.*:required|file|mimes:pdf|max:2048')]
public $files;
public function uploadFiles()
{
$this->validate();
session()->flash('message', 'Files uploaded successfully!');
}
public function render()
{
return view('livewire.file-upload');
}
}
?>
<?php
namespace Tests\Feature\Livewire;
use App\Livewire\FileUpload;
use Illuminate\Http\UploadedFile;
use Livewire\Livewire;
use Tests\TestCase;
class FileUploadTest extends TestCase
{
public function test_multiple_files_upload_successfully()
{
$files = [
UploadedFile::fake()->create('document1.pdf', 1000),
UploadedFile::fake()->create('document2.pdf', 1500),
];
Livewire::test(FileUpload::class)
->upload('files', $files)
->call('uploadFiles')
->assertHasNoErrors('files')
->assertSee('Files uploaded successfully!');
}
public function test_multiple_files_validation_fails()
{
$files = [
UploadedFile::fake()->image('image.jpg'),
UploadedFile::fake()->create('document.pdf', 3000),
];
Livewire::test(FileUpload::class)
->upload('files', $files)
->call('uploadFiles')
->assertHasErrors('files');
}
}
?>
В этих примерах мы передаем массив файлов в метод upload и проверяем как успешную загрузку, так и ошибки валидации.
Смотрите также
-
метод
set,
который устанавливает значение свойства компонента -
метод
call,
который вызывает метод компонента -
метод
assertHasErrors,
который проверяет наличие ошибок валидации -
метод
assertSee,
который проверяет наличие текста в выводе компонента