Загрузка и изменение размера тестируемого файла Laravel

#laravel #testing #phpunit

#laravel #тестирование #phpunit

Вопрос:

Я пытаюсь разработать что-то с использованием TDD-способа и сталкиваюсь с проблемой, которую не могу решить.

Я загружаю изображение, размер которого изменяется и сохраняется в базе данных.

Когда я делаю это вручную (используя свой браузер как обычный пользователь), это работает, но тест завершается неудачей.

Вот мой контроллер:

 public function store(Product $product)
    {
        //$name = request('image')->store('products', 'public');

        $name = str_random(50).'.jpg';
        $path = storage_path('app/public/products/'.$name);

        $image = Image::make(request('image'));
        $image->fit(400, 400);
        $image->save($path);

        $product->photos()->save(new Photo([
            'name' => $name
        ]));

        return redirect($product->adminPath());
    }
  

и вот мой тест

 public function a_user_can_add_photos_to_the_product()
    {
        $this->withoutExceptionHandling();
        $this->signIn();

        $product = ProductFactory::create();

        Storage::fake('public');

        $this->post($product->adminPath('/photos'), [
            'image' => UploadedFile::fake()->image('photo.jpg')
        ])->assertRedirect($product->adminPath());

        $product->load(['photos']);

        tap($product->photos->first(), function ($photo) {
            $this->assertInstanceOf('AppPhoto', $photo);

            Storage::disk('public')->assertExists($photo->name);
        });

        $this->assertEquals(1, $product->photos->count());
    }
  

На этом этапе тест завершится неудачей, но если я прокомментирую часть изменения размера и использую метод store для запроса следующим образом:

 TestsFeatureManageProductPhotoTest::a_user_can_add_photos_to_the_product
Unable to find a file at path [pJ1Zd19XT0aF9fc5W1famc3n7WwxBt3L9MDB0yRJNlVYcWkMwk.jpg].
Failed asserting that false is true.
  
 public function store(Product $product)
    {
        $name = request('image')->store('products', 'public');

        /*$name = str_random(50).'.jpg';
        $path = storage_path('app/public/products/'.$name);

        $image = Image::make(request('image'));
        $image->fit(400, 400);
        $image->save($path);*/

        $product->photos()->save(new Photo([
            'name' => $name
        ]));

        return redirect($product->adminPath());
    }
  

Тест пройден.

Как я могу решить эту проблему?

Комментарии:

1. Что вы получаете, когда удаляете Storage::fake('public'); строку и снова добавляете часть изменения размера и сохранения в store функцию?

2. Когда ошибка завершается сбоем, то здесь должна быть проблема с кодом. Вы правы насчет кода, который работает нормально, если вы используете его из браузера, но вам также следует просмотреть журнал ошибок и проверить свои тесты, чтобы увидеть, отправляете ли вы именно тот запрос, который следует отправить. таким образом, вы очень легко обнаружите проблему.

3. Вам удалось решить эту проблему? У меня та же проблема — это связано с поддельным хранилищем — изображение ожидает, что изображение находится в каталоге, и не находит его, но я не могу найти способ тестирования и издевательства над изображением, чтобы избежать создания реальных файлов для изменения размера