محمد امیری
4 سال پیش توسط محمد امیری مطرح شد
2 پاسخ

تست mocking درلارول

سلام.
من میخوام سیستم ارسال ایمیل رو تو لاراول تست بنویسم براش و این ایمیل درون یک event ای داخل متد handle که داخل listener اون event قرار داره ارسال میشه(البته میدونم بهتره از سیستم notification استفاده کنم اما صرفا تست هستش) متاسفانه تست event درست pass میشه اما جالبه ایمیل رو میگه ارسال نمیشه و خطای زیر رو تو console میده.

The expected [App\Mail\sendEmail] mailable was not queued. Failed asserting that false is true.

که همون پاس نشدن تست هستش اما جالبه همون کد که داخل handle هستش رو میارم مستقیم داخل کنترلر اجرا میکنم بدون event تست pass میشه.اینم بگم که تست اجرا شدن event هم pass میشه و مشکل از event بنده نیست.ممنون میشم کمک کنید.
کدای تست :

 public function testCanTestEventTest()
    {
        Event::fake();
        Mail::fake();

        $data = [
            'email' => 'mohammadeng3731@gmail.com',
            'name' => 'mohammad',
            'password' => bcrypt('mohammadeng'),
            '_token' => csrf_token()
        ];

        $this->post('/', $data)
            ->assertOk();

        $this->assertDatabaseHas('users', [
            'email' => 'mohammadeng3731@gmail.com'
        ]);

        Event::assertDispatched(function (makeUserEvent $event) use ($data) {

            return $event->user->email === $data['email'];

        });

        Mail::assertSent(function (sendEmail $email) use ($data) {

            return $email->user->email == $data['email'];
        });

    }

کدهای درون کنترلر برای pass شدن :

 $user = \App\User::create([
        'email' => request()->email,
        'name' => request()->name,
        'password' => request()->password,
    ]);
    $code = rand(1000000, 10000000);

    event(new \App\Events\makeUserEvent($user, $code));

کدهای درون handle:

  public function handle(makeUserEvent $event)
    {

        Mail::to($event->user->email)->send(new sendEmail($event->code,$event->user));

    }

constructor فایل ایمیلم :

 public function __construct($code,User $user)
    {
        $this->code = $code;
        $this->user=$user;
    }

event و listener رو هم به هم وصل کردم درون EventServiceProvider و نگرانی ای بابتش نیست .این رو هم بگم از هیچگونه سیستم صفی استفاده نکردم
@mohsenbostan
@ali.bayat
@MehdiAghighi
@milad


ثبت پرسش جدید
محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش مطرح شد
0

@mohammadeng3731
سلام.
با دو متد زیر هم تست کنید ببنید نتجیه به چه صورت هستش:

Mail::assertQueued
----------------------
Mail::assertNotQueued

محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش مطرح شد
0

@mohsenbostan تست کردم. درست نشد.ایمیلو میبرم داخل event کلا pass نمیشه ولی جالبه خود کد اصلی کار میکنه ایمیل ارسال میشه.


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

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