首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当模拟邮件时,laravel测试,但是在运行端到端测试时,邮件会被传递。

当模拟邮件时,laravel测试,但是在运行端到端测试时,邮件会被传递。
EN

Stack Overflow用户
提问于 2017-11-11 17:54:31
回答 1查看 1.3K关注 0票数 0

通过laravel文档,您可以使用Mail::fake()导入Illuminate\Support\Facades\Mail来测试测试中的行为,但是,当我模拟邮件时,我的测试失败了,如果我从控制器运行流,使用ruby mailcatcher作为SMTP服务器,我可以看到在mailcatcher的web ui中传递的邮件。

下面是测试用例代码,在不了解出了什么问题后,我尝试了两种不同的断言

代码语言:javascript
复制
<?php

namespace Tests\Unit;

use Tests\TestCase;
use App\Entities\Requester;
use App\Mail\RequesterRegistered;
use Illuminate\Support\Facades\Mail;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;

class RequesterRegisteredTest extends TestCase {

  use RefreshDatabase;

  public function setUp()
  {
    parent::setUp();
    Mail::fake();
  }

  public function testRequesterCreationTriggersEmail(){

    $expected = factory(Requester::class)->create();

    //assert email was to the company employee
    Mail::assertSent(RequesterRegistered::class, function ($mail) use ($expected) {
       return $mail->requester()->email_id === $expected->email_id;
    });

    // Assert a message was sent to the given users...
    Mail::assertSent(RequesterRegistered::class, function ($mail) use ($expected) {
      return $mail->hasTo($expected->email_id);
    });
  }
}

我在事件服务类中声明了观察者。

代码语言:javascript
复制
public function boot()
{
    parent::boot();

    Requester::observe(RequesterObserver::class);
}

并且观察者有一个创建的方法,它调用这个mailer。

代码语言:javascript
复制
public function created(Requester $requester)
{
    Log::debug("Sending registration email to :" . $requester->email_id);
    $message = (new RequesterRegistered($requester))->onQueue('import-mailer');
    Mail::to($requester->email_id)->queue($message);
}

这是测试结果

代码语言:javascript
复制
MacBook-Pro-3:ctd-bo anadi$ ./vendor/bin/phpunit --filter RequesterRegisteredTest
PHPUnit 6.4.3 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 7.72 seconds, Memory: 16.00MB

There was 1 failure:

1) Tests\Unit\RequesterRegisteredTest::testRequesterCreationTriggersEmail
The expected [App\Mail\RequesterRegistered] mailable was not sent.
Failed asserting that false is true.

/Users/anadi/Code/CTD/ctd-bo/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/MailFake.php:41
/Users/anadi/Code/CTD/ctd-bo/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:221
/Users/anadi/Code/CTD/ctd-bo/tests/Unit/RequesterRegisteredTest.php:29

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

更别提对此观察者进行类似的事件测试了,如果碰巧使用Event::fake(),也会失败。

我使用sync作为队列连接来测试环境和本地开发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 12:53:39

在您的测试中,尝试:Mail::assertQueued( ... )代替。

即使您将队列驱动程序设置为同步,但虚假邮件将在其队列中包含您的邮件,因为您有:

Mail::to($requester->email_id)->queue($message);

而不是:

Mail::to($requester->email_id)->send($message);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47241053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档