Laravel 8 事件模拟
作为 mock 的替代方法,你可以使用 Event
Facade 的 fake
方法来模拟事件监听,测试的时候并不会真正触发事件监听器。然后你就可以测试断言事件运行了,甚至可以检查他们接收的数据。使用 fake 的时候,断言一般出现在测试代码的后面:
<?php
namespace Tests\Feature;
use App\Events\OrderFailedToShip;
use App\Events\OrderShipped;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Event;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 测试订单发送
*/
public function testOrderShipping()
{
Event::fake();
// 执行订单发送...
// 断言已完成特定类型的工作,以满足给定的真实性测试...
Event::assertDispatched(function (OrderShipped $event) use ($order) {
return $event->order->id === $order->id;
});
// 断言一个事件被发送了两次...
Event::assertDispatched(OrderShipped::class, 2);
// 断言任务并未分发...
Event::assertNotDispatched(OrderFailedToShip::class);
}
}
注意:调用
Event::fake()
后不会执行事件监听。所以,如果你的测试用到了依赖于事件的模型工厂,例如,在模型的creating
事件中创建 UUID ,那么你应该在调用Event::fake()
之前 使用模型工厂创建数据。