我在我的控制器中触发一个事件,该事件调度发送电子邮件的侦听器。我的代码在生产中运行良好。但是我正在为它编写一个测试用例(使用完整的http请求),但是事件监听器并不处理被触发的事件(被触发)。
如何在我的测试用例中激活监听器?我错过了什么吗?当我手工测试时,代码运行良好。
我使用Laravel 5.4与PHP 7.1和PHPUnit。
我没有使用像Event::fake();
这是我的代码的缩小版本:
class OrderController extends Controller
{
public function store(Request $request): JsonResponse
{
$order = new Order($request->all());
$order->store();
event(new OrderStored($order));
// no problem here
return response()->json(['id' => $order->id()]);
}
}
-
class OrderStored
{
private $order;
public function __construct(Order $order)
{
$this->order = $order;
// this place is reachable
}
public function getOrder(): Order
{
return $this->order;
}
}
-
class SendOrderStoredEmail
{
private $mailer;
public function __construct(Mailer $mailer)
{
// this place is not reachable in my tests
$this->mailer = $mailer;
}
public function handle(OrderStored $event): void
{
$this->mailer->send(new OrderStoredMail($event->getOrder()));
}
}
最后我的EventServiceProvider:
class EventServiceProvider extends BaseEventServiceProvider
{
protected $listen = [
OrderStored::class => [SendOrderStoredEmail::class],
];
}
答案 0 :(得分:0)
Mail::fake();
将一个MailFake注入我的监听器,因此类型提示失败。使用Illuminate\Contracts\Mail\Mailer
的合同解决了问题。