通过laravel文档,您可以使用Mail::fake()导入Illuminate\Support\Facades\Mail来测试测试中的行为,但是,当我模拟邮件时,我的测试失败了,如果我从控制器运行流,使用ruby mailcatcher作为SMTP服务器,我可以看到在mailcatcher的web ui中传递的邮件。
下面是测试用例代码,在不了解出了什么问题后,我尝试了两种不同的断言
<?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);
});
}
}我在事件服务类中声明了观察者。
public function boot()
{
parent::boot();
Requester::observe(RequesterObserver::class);
}并且观察者有一个创建的方法,它调用这个mailer。
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);
}这是测试结果
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作为队列连接来测试环境和本地开发。
发布于 2018-03-29 12:53:39
在您的测试中,尝试:Mail::assertQueued( ... )代替。
即使您将队列驱动程序设置为同步,但虚假邮件将在其队列中包含您的邮件,因为您有:
Mail::to($requester->email_id)->queue($message);
而不是:
Mail::to($requester->email_id)->send($message);
https://stackoverflow.com/questions/47241053
复制相似问题