تست اپلیکشن لاراول باphpunit

- 1 هفته پیش
توسط علی بیات آپدیت شد
Arshavir ( 20816 تجربه )
2 هفته پیش
تخصص : Golang/Laravel

سلام دوستان
من دارم با test لاراول کار می کنم phpunit
این کد قسمت تست من هست

class PopulatingFakeTest extends TestCase
{

    use RefreshDatabase;

    public function test_a_user_can_browse_threads()
    {
        $thread = factory('App\User')->create();

        $response = $this->get('/threads');
        $response->assertSee($thread->title);
        $response->assertStatus(404);
    }
}

زمانی که دستور

phpunit —filter PopulatingFake

رو میرنم تمام اطلاعات موجود در جدول user رو پاک می کنه
مشکل از کجاست؟

بهترین پاسخ انتخاب شده توسط Arshavir
Arshavir
1 هفته پیش

اینو باید داخل کلاس تست use میکردم

 use DatabaseTransactions;

@ali.bayat

علی بیات ( 123657 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

چون که شما دارید از ترِیت RefreshDatabase استفاده میکنید و کار این تریت اینه که برای مقاصد تست (چون در هر تست ممکنه چندین سطر به اطلاعات جدول اضافه بشه) اطلاعات جدول مربوطه رو پاک میکنه.

اما حذف کردنش هم گزینه خوبی نیست. باید phpunit رو کانفیگ کنید که برای تست از یه دیتابیس دیگه استفاده کنه نه از دیتابیس اصلی شما..

برای این کار:

config/database.php

'connections' => [

    'sqlite_testing' => [
        'driver'   => 'sqlite',
        'database' => ':memory:',
        'prefix'   => '',
    ],
    .
    .
    .

phpunit.xml

    .
    .
    .
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="APP_URL" value="http://example.dev"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_CONNECTION" value="sqlite_testing"/>
    </php>
</phpunit>

بعد کش config رو پاک کنید و امتحان کنید:

php artisan config:clear
علی بیات ( 123657 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

در ضمن نوع Assertion ی که استفاده کردید باید اصلاح کنید. کد Status شماره 404 برای مواردی که یافت نمیشن استفاده میشه (Page not Found).

در یک متد تست، تست های شما باید هم‌سو باشند. الان در کدهای شما assertSee احتمالا true خواهد بود و assertStatus برابر false خواهد بود. و این باعث میشه که تست با موفقیت انجام نشه..بهتره از استاتوس کد صحیح استفاده کنید


        $response = $this->get('/threads');
        $response->assertSee($thread->title);
        $response->assertStatus(200);
Arshavir ( 20816 تجربه )
1 هفته پیش
تخصص : Golang/Laravel

@ali.bayat
درمورد پاسخ اولی که دادید
من دارم از mysql استفاده می کنم از sqlite استفاده نمی کنم

Arshavir ( 20816 تجربه )
1 هفته پیش
تخصص : Golang/Laravel

@ali.bayat
درمورد پاسخ دوم که دادید
من توی اون تکه کد اصلن صفحه ای به نام /threads ندارم بخاطر همین وضعیت رو روی 404 قرار دادم که تست کنم

Arshavir ( 20816 تجربه )
1 هفته پیش
تخصص : Golang/Laravel

اینو باید داخل کلاس تست use میکردم

 use DatabaseTransactions;

@ali.bayat

علی بیات ( 123657 تجربه )
1 هفته پیش
تخصص : توسعه دهنده ارشد وب

@Arshavir
mysql یا sqlite فرقی نداره. من sqlite رو مثال زدم چونکه حالت :memory: رو هم پشتیبانی میکنه

و چنانچه صفحه Threads رو هم ندارید، تست ها تون رو یک‌سو کنید... این جوری تست شما فِیل میشه..

برای ارسال پاسخ باید وارد سایت شوید