روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۵ دانشجوی سون‌لرن
پاک کردن جدول دیتابیس بعد از تست، چگونه وارد کردن دیتا را از ۲ به ۱ تغییر داد؟
جامعه پی اچ پی ایجاد شده در ۲۶ فروردین ۱۴۰۱

سلام. من در این قسمت کمی گیج شد

کد زیر باعث میشد که دیتا دوبار وارد بشه و دوبار هم آپدیت میشد

public function testItCanCreateData()
    {
        $result = $this->insertIntoDb();
        $this->assertIsInt($result);
        $this->assertGreaterThan(0, $result);
    }
    public function testItCanUpdateData()
    {
        $this->insertIntoDb();
        $result = $this->queryBuilder
            ->table('bugs')
            ->where('user', 'My name')
            ->update(['email' => 'mename@hotmail.com', 'name' => 'My name']);
        $this->assertEquals(2, $result);
    }

حالا کد زیر میاد و بعد از اجرا، کل جدول‌ها رو پاک میکنه:

public function tearDown(): void
    {
        $this->queryBuilder->truncateAllTable();
        parent::tearDown();
    }

خب اول دوتا کد بالا اجرا میشه و بعد جداول پاک میشه!!! همچنان باید در دو تابع اول دوبار اطلاعات وارد بشه و هر دوبار هم آپدیت بشه. چطوری این آپدیت شد یک بار؟

سلام دوست عزیز

اگر درست متوجه سوالتون شده باشم، دلیلش اینه که متد setUp و tearDown میان قبل (setUP) و بعد(tearDown) از اجرای هر تست اجرا میشن برای همین موضوع که ما میگیم تست هامون ایزوله هستن

محمد گازری ۲۶ فروردین ۱۴۰۱، ۰۸:۳۲

سلام دوست عزیز

همون طور که آقای گازری فرمودند تست‌های ما به طور کامل ایزوله هستند و هیچ ارتباط و وابستگی به سایر تست‌ها ندارند مگر اینکه خودمون یک تست رو به تست دیگه وابسته کنیم

ما زمانی که خواستیم تست بنویسیم که دیتا داخل دیتابیس اضافه بشه اومدیم یک تست نوشتیم که دیتا اضافه بشه و بعد اثبات کردیم که این دیتا اضاقه شد و بعد بلافاصله بعد از هر تست متد teardown اجرا میشه که میاد کل جدول رو پاک میکنه

حالا رفتیم سراغ تست بعدی که اثبات کنیم orm ما میتونه یک دیتا رو اپدیت کنه

اومدیم داخل این متد اول یه دیتا اضافه کردم چون داخل دیتابیس چیزی نداشتیم ومتد teardown اون رو پاک کرد

حالا دیتا رو اضافه کردیم و بعد اومدیم اپدیت کردم و اثبات کردیم که اطلاعات ما داره آپدیت میشه.

متد setup که اول از همه نوشتیم قبل از هر تست ما اجرا میشه و متد teardown ما بعد از هر تست اجرا میشه و کل جدول رو خالی میکنه که تست‌های بعدی با دیتابیس بدون مشکل کار کنند.

پس هیچ کدوم از تست‌های ما به هم وابستگی نداره و کاملا مستقل و ایزوله هستند

بهترین پاسخ
کیان سلگی ۲۶ فروردین ۱۴۰۱، ۰۸:۴۵

وقتی که ما tearDown رو اجرا کردیم روی کد زیر تاثیر داشت

        $this->assertEquals(2, $result);

اون عدد ۲ به ۱ تبدیل شد

الان بحث منم همینه: «متد setUp و tearDown میان قبل (setUP) و بعد(tearDown) از اجرای هر تست اجرا میشن»

پس چطوری روی این عدد تاثیر گذاشت؟

سیدرضا بازیار ۲۶ فروردین ۱۴۰۱، ۰۸:۴۶

من کدتون را کامل ندیدم و جدای اون دوتا لینک براتون میذارم مطالعه کنید

https://phpunit.readthedocs.io/en/9.5/fixtures.html

https://dyclassroom.com/phpunit/phpunit-fixtures-setup-and-teardown

محمد گازری ۲۶ فروردین ۱۴۰۱، ۰۸:۵۱

لطفا تلگرام به ای دی amir_programer_1380 پیام بدید گوگل میت باهم صحبت کنیم و مشکل رو رفع کنیم

ولی به طور کلی این مشکل به این خاطر هست که من احتمال میدم یک دیتا داخل دیتابیس شما از قبل ثبت شده و اون داره تداخل ایجاد میکنه که این مورد در ادامه اموزش گفته شده و با استفاده از transaction‌ها برطرف میشه

کیان سلگی ۲۶ فروردین ۱۴۰۱، ۰۸:۵۳