bardia
5 سال پیش توسط bardia مطرح شد
6 پاسخ

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

سلام دوستان
من دارم با 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 رو پاک می کنه
مشکل از کجاست؟


ثبت پرسش جدید
bardia
تخصص : Golang/Laravel
@mrbardia72 5 سال پیش مطرح شد
0

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

 use DatabaseTransactions;

@ali.bayat


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

چون که شما دارید از ترِیت 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

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

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

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


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

bardia
تخصص : Golang/Laravel
@mrbardia72 5 سال پیش مطرح شد
0

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


bardia
تخصص : Golang/Laravel
@mrbardia72 5 سال پیش مطرح شد
0

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


bardia
تخصص : Golang/Laravel
@mrbardia72 5 سال پیش مطرح شد
0

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

 use DatabaseTransactions;

@ali.bayat


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

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

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام