Estoy tratando de agregar una función de imagen de perfil en mi aplicación. Estoy usando el enfoque TDD para hacer esto. La prueba para cargar la imagen de perfil se muestra en verde. Pero cuando ejecuto la prueba para actualizar la foto de perfil, da un error. A continuación se muestra el código:
Controlador:
public function store(StoreAvatarRequest $request) { $path = $request->file('avatar')->store('avatars'); BasicInformation::updateOrCreate([ 'user_id' => auth()->id(), ], [ 'user_id' => auth()->id(), 'avatar' => $path, ]); $this->showAlerts('alert-success', 'Profile Image uploaded successfully'); return redirect()->route('avatar.index'); } public function update(StoreAvatarRequest $request, $id) { $basicProfile = BasicInformation::find($id)->first(); $oldAvatarPath = $basicProfile->avatar; if ($basicProfile->user_id == auth()->id()) { $path = $request->file('avatar')->store('avatars'); $basicProfile->avatar = $path; $basicProfile->update(); Storage::delete($oldAvatarPath); $this->showAlerts('alert-success', 'Profile Image Updated Successfully'); return redirect()->route('avatar.index'); } else { // TODO :: Need to add logic here } }Caso de prueba:
public function can_update_profile_picture() { $this->actingAs($this->lawyer)->post(route('avatar.store'), [ 'avatar' => UploadedFile::fake()->image('avatar.jpg', 600, 600) ]); $oldImagePath = $this->lawyer->information->avatar; $this->actingAs($this->lawyer)->put(route('avatar.update', ['id' => $this->lawyer->information->id]), [ 'avatar' => UploadedFile::fake()->image('avatar1.jpg', 600, 600) ]) ->assertRedirect(route('avatar.index')) ->assertSessionHas('status', 'Profile Image Updated Successfully'); Storage::disk('local')->assertExists($this->lawyer->information->avatar); Storage::disk('local')->assertMissing($oldImagePath); }Recibo el siguiente error cuando ejecuto la prueba:
PHPUnit 5.7.19 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 298 ms, Memory: 20.00MB There was 1 failure: 1) Tests\Feature\Dashboard\Lawyer\Account\ProfileImageTest::can_update_profile_picture Unable to find a file at path [local/c5tjUUQDzU4iKHauJK68Z801I5iaYJ7e3cVQ5iA1.jpeg]. Failed asserting that false is true.Esta es una cuestión de configuración y luego preferencia por usar los métodos store() o storeAs().
En primer lugar, debe configurar filesystems.php para reconocer su disco de almacenamiento de prueba como el disco fake() :
'testing' => [ 'driver' => 'local', 'root' => storage_path('framework/testing/disks/'), 'visibility' => 'public', El uso de esa configuración le permite usar su valor APP_ENV en phpunit.xml para establecer este disco por defecto para sus pruebas.
Además, uso storeAs() en mi controlador para poder probar con el nombre de archivo que almacené en el método assertExists() en mi prueba.
$request->file('avatar')->storeAs('avatar', $request->file('avatar')->getClientOriginalName()) Storage::disk('avatar')->assertExists('avatar.jpg'); Esto es lo que funciona para mí y los archivos se eliminan antes de ejecutar cada prueba y la limpieza no es un problema. También puede hacer una prueba para hashName y usar el método store() obteniendo la respuesta y usando baseName() para obtener el nombre del nuevo archivo.
He agregado a phpunit.xml la siguiente línea:
<env name="FILESYSTEM_DRIVER" value="uploads"/>y al revisar
$image = $response->original['logo']; // as the image name get changed in Controller Storage::disk('uploads')->assertExists("public/uploads/$image");Otros códigos son similares a Laravel Doc . Es posible que desee consultar la discusión en Laracast .