سلام دوستان
من دارم با 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 رو پاک می کنه
مشکل از کجاست؟
چون که شما دارید از ترِیت 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
در ضمن نوع Assertion ی که استفاده کردید باید اصلاح کنید. کد Status شماره 404 برای مواردی که یافت نمیشن استفاده میشه (Page not Found).
در یک متد تست، تست های شما باید همسو باشند. الان در کدهای شما assertSee احتمالا true خواهد بود و assertStatus برابر false خواهد بود. و این باعث میشه که تست با موفقیت انجام نشه..بهتره از استاتوس کد صحیح استفاده کنید
$response = $this->get('/threads');
$response->assertSee($thread->title);
$response->assertStatus(200);
@ali.bayat
درمورد پاسخ اولی که دادید
من دارم از mysql استفاده می کنم از sqlite استفاده نمی کنم
@ali.bayat
درمورد پاسخ دوم که دادید
من توی اون تکه کد اصلن صفحه ای به نام /threads ندارم بخاطر همین وضعیت رو روی 404 قرار دادم که تست کنم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟