#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. Вам удалось решить эту проблему? У меня та же проблема — это связано с поддельным хранилищем — изображение ожидает, что изображение находится в каталоге, и не находит его, но я не могу найти способ тестирования и издевательства над изображением, чтобы избежать создания реальных файлов для изменения размера