【问题标题】:Event listener not dispatched while testing测试时未调度事件侦听器
【发布时间】: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


【解决方案1】:

Mail::fake(); 将 MailFake 的实例注入到我的侦听器中,因此类型提示失败。使用Illuminate\Contracts\Mail\Mailer的合约解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2022-08-03
    • 2017-07-15
    相关资源
    最近更新 更多