اذهب إلى المحتوى

السؤال

نشر

أحاول إنشاء اختبار test لرفع الملفات في مشروع لارافل، ولكنه يفشل في كل مرة.

كود الاختبار:

$JSONResponse = $this->call('POST', '/upload', [], [], [
    'photo' => new UploadedFile(base_path('public/uploads/') . '/img1.jpg', 'img1.jpg')
]);

$this->assertResponseOk();
$this->seeJsonStructure(['name']);

$response = json_decode($JSONResponse);
$this->assertTrue(file_exists(base_path('public/uploads') . '/' . $response['name']));

والمتحكّم المسؤول عن رفع الملف:

$name = 'anyname' . '.' . $request->file('photo')->getClientOriginalExtension();

$request->file('photo')->move('/uploads', $name);

return response()->json(['name' => $name]);

علماً بأنه سيتم حفظ الملفات ضمن المسار التالي: /public/uploads/

أين الخطأ؟ وماهي الطريقة الصحيحة لاختبار رفع الملفات في لارافل؟

Recommended Posts

  • 0
نشر

عند إنشائك نُسخة من الصنف UploadedFile قم بتمرير القيمة true لآخر وسيط بهذا الشكل و هذا الوسيط هو وسيط بولياني يأخذ true إن كانت البيئة هي بيئة إختبارية و القيمة الإفتراضية له هي false.

$file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true);
                                                                           ^^^^

و هذا مثال يوضح الآلية بإعتبار وجود ملف صورة بالإسم test.png بداخل مجلد tests/stubs:

<?php
class UploadTest extends TestCase
{
  public function test_upload_works()
  {
    $stub = __DIR__.'/stubs/test.png';
    $name = str_random(8).'.png';
    $path = sys_get_temp_dir().'/'.$name;

    copy($stub, $path);

    $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true);
    $response = $this->call('POST', '/upload', [], [], ['photo' => $file], ['Accept' => 'application/json']);

    $this->assertResponseOk();
    $content = json_decode($response->getContent());
    $this->assertObjectHasAttribute('name', $content);

    $uploaded = 'uploads'.DIRECTORY_SEPARATOR.$content->name;
    $this->assertFileExists(public_path($uploaded));

    @unlink($uploaded);
  }
}

بإمكانك أيضاً النظر إلى التابع fake فهو يُساعد كثيراً في عملية إختبار رفع الملفات مثال:

<?php
class UploadTest extends TestCase
{
  public function test_upload_works()
  {
    $this->post(
        action('AttachmentController@store'),
        ['file' => UploadedFile::fake()->image('file.png', 600, 600)]
    );

    /** @var \App\Attachment $attachment */
    $this->assertNotNull($attachment = Attachment::query()->first());
    $this->assertFileExists($attachment->path());
    @unlink($attachment->path());
  }
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...