【发布时间】:2018-08-06 22:51:00
【问题描述】:
我在控制器中触发了一个事件,该事件调度了一个发送电子邮件的侦听器。我的代码在生产中运行良好。但是我目前正在为它编写一个测试用例(使用完整的 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],
];
}
【问题讨论】:
-
看来,
Illuminate\Mail\Mailer在测试期间是不可实例化的! -
您应该添加您列出的所有类的名称空间,因为不清楚它们都是什么。我假设有一个事件、一个侦听器、一个可邮寄的,或者可能没有?
标签: php laravel phpunit laravel-5.4