محتويات الدورة

Laravel / حدود التطبيق وسير العمل الموثوق / الدرس 12

اختبارات الميزات لإثبات حدود التطبيق

اختبر المسارات والمصادقة والتحقق والسياسات والحفظ وشكل الرد بسير مصطنع معزول.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختيار وعد ملحوظ
  • إثبات الرفض وحفظ الحالة
  • ضبط الحدود الخارجية وفهم ما لم يختبر

اختيار وعد ملحوظ

يختبر اختبار الميزة حدا مفيدا لا كل طريقة خاصة. صف الوعد: يعدل المؤلف ولا يعدل غيره ولا يدرج عنوان خاطئ. قد يرافق النجاح أو الإعادة مالك خاطئ وتسريب وتعديل جزئي؛ افحص الرد والأثر واشتق المتوقع من القاعدة لا نسخ التنفيذ.

بيئة اختبار معزولة فعلا

تحقق أولا من قاعدة اختبار قابلة للاستغناء وعينات مصطنعة. تنسق RefreshDatabase الترحيل أو المعاملة ولا تثبت أمان الوجهة. وفر مصانع صالحة وعلاقات، وقد تفيد SQLite دون تمثيل كل قفل وترتيب وJSON وقيد بمحرك النشر. تحتاج العقود الخاصة دليلا معزولا مناسبا. المقاطع غير مستقلة لأن البيئة غير منشأة هنا.

إثبات الرفض وحفظ الحالة

يفترض الاختبار المسار والسياسة والمصانع والترحيلات والمسار المسمى. ينشئ مستخدمين ومنشورا للأول ويرفض الآخر ويثبت العنوان والمالك. يثبت اختبار مستقل نجاح المالك كي لا يمر رفض الجميع. توفر actingAs الهوية ولا تختبر كلمة السر، ولكل حالة عينتها وطلبها الرئيسي.

php مقطع سياقي لتطبيق Laravel 12
<?php
namespace Tests\Feature;
use App\Models\Post;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class PostAuthorizationTest extends TestCase
{
    use RefreshDatabase;
    public function test_other_user_cannot_change_a_post(): void
    {
        $owner = User::factory()->create();
        $other = User::factory()->create();
        $post = Post::factory()->for($owner, "author")->create(["title" => "Original"]);
        $this->actingAs($other, "web")->patch("/posts/{$post->getRouteKey()}", [
            "title" => "Changed", "body" => "Synthetic body",
        ])->assertForbidden();
        $this->assertDatabaseHas("posts", ["id" => $post->id, "user_id" => $owner->id, "title" => "Original"]);
    }
    public function test_author_can_change_a_post(): void
    {
        $owner = User::factory()->create();
        $post = Post::factory()->for($owner, "author")->create(["title" => "Original"]);
        $this->actingAs($owner, "web")->patch("/posts/{$post->getRouteKey()}", [
            "title" => "Changed", "body" => "Synthetic body",
        ])->assertRedirect(route("posts.show", $post));
        $this->assertDatabaseHas("posts", ["id" => $post->id, "user_id" => $owner->id, "title" => "Changed"]);
    }
}
الناتج المتوقع
In the isolated intended app: non-owner gets 403 and no change; owner gets redirect and changed title.

يتطلب قاعدة اختبار معزولة ومصانع ومسارات وسياسة، ولم ينفذ على تطبيق المستودع.

اختبار الخطأ دون حفظ عرضي

يرسل الثاني عنوانا فارغا بهوية مسموحة ويتوقع خطأ title وغياب الإدراج. لا يثبت جملة مترجمة حرفية لتغير المحلية والرسائل. يفيد العدد الصفري لأن العينة بلا منشورات. أضف اختبارات نجاح لحقول المؤلف والنشر؛ فلا يكشف الرفض ثقة user_id عند النجاح. وضح متطلبات كل اختبار.

php مقطع سياقي لتطبيق Laravel 12
<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class PostValidationTest extends TestCase
{
    use RefreshDatabase;
    public function test_missing_title_does_not_create_a_post(): void
    {
        $user = User::factory()->create();
        $this->actingAs($user, "web")->postJson("/posts", [
            "title" => "", "body" => "Synthetic body",
        ])->assertUnprocessable()->assertJsonValidationErrors(["title"]);
        $this->assertDatabaseCount("posts", 0);
    }
}
الناتج المتوقع
Expected isolated assertions: 422, title validation error, posts count 0.

يفترض عينة فارغة وسياسة إنشاء ومسار الطلب ويفحص JSON وعدم الإدراج لا المتصفح وCSRF.

ضبط الحدود الخارجية وفهم ما لم يختبر

زيف البريد والطابور والتخزين وHTTP لاختبار طلب الأثر، واحتفظ بتكامل الموائم عند الحاجة دون عمليات حقيقية. ليس HTTP الاختباري متصفحا ولا يثبت السكربت أو ارتباط الوكيل أو الإتاحة. تتجاوز بيئة الاختبار عادة CSRF فلا تثبت توصيلها بالمتصفح. اجمع مستويات الاختبار بحسب الخطر وأعد المناسب للتغيير.

الأخطاء الشائعة وإصلاحها

ينجح اختبار رغم كتابة ممنوعة

لماذا يحدث؟
يفحص الحالة فقط.
كيف تصلحه؟
أكد حفظ المخزن.
كيف تتجنب تكراره؟
ضم الرفض ونجاح المالك.

تعد RefreshDatabase أمانا لكل وجهة

لماذا يحدث؟
لم يفحص الاتصال.
كيف تصلحه؟
حدد بيئة معزولة قابلة للاستغناء.
كيف تتجنب تكراره؟
افحصها قبل التنفيذ.

يوصف اختبار الميزة تغطية متصفح

لماذا يحدث؟
يتخطى HTTP سلوك المتصفح.
كيف تصلحه؟
أضف دليله المناسب.
كيف تتجنب تكراره؟
سم ما اختبره كل مستوى.

اختبر فهمك

1. صمم اختبار إنشاء يكشف معرف مؤلف مزورا.

اعرض الحل المشروح

صادق A وأرسل قيما صحيحة مع user_id=B وأكد ملك A والنشر الخادمي والنجاح. يختبر ذلك مسارا لا يصل إليه رفض العنوان.

2. أي دليل إضافي يلزم لعقد JSON أو قفل خاص بالمحرك؟

اعرض الحل المشروح

اختبر تكاملا محددا بنسخة معزولة من المحرك المقصود ببيانات مصطنعة وتنظيف. يفيد اختبار التطبيق ولا يثبت دلالات لا ينفذها البديل.

أهم ما تعلمته

  • أكد النتائج والثوابت لا الحالة فقط.
  • يجب إعداد العزل والتحقق منه.
  • تقدم المستويات أدلة مختلفة.

المراجع الرسمية