gpt4 book ai didi

laravel - 测试 assertDispatched 仅在使用事件助手时有效

转载 作者:行者123 更新时间:2023-11-28 20:50:45 27 4
gpt4 key购买 nike

注册服务提供商:

public function register()
{
$this->app->singleton(CartInterface::class, function ($app) {
return new SessionCart($app['session'], $app['events']);
});
}

在上述服务中触发事件:

$this->events->fire('cart.added', $item);

测试服务:

public function it_can_add_an_item()
{
Event::fake();
$this->cartService->add(new Item);

$this->assertEquals(1, $this->cartService->count());
Event::assertDispatched('cart.added');
}

结果:未发送预期的 [cart.added] 事件。

如果不是使用 $this->events 来触发事件,我只是使用像 event('cart.added') 这样的事件助手,我又回到了绿色.

我并没有死于使用面向对象的方法,但我真的很好奇它在这里不起作用的原因,因为事件助手似乎正在使用容器中的调度程序实例,就像我在注册服务时这样做。

有什么线索吗?

最佳答案

这是执行测试时发生的情况:

  1. laravel 应用程序已启动;它将非假事件调度程序绑定(bind)到服务容器
  2. 您将 CartInterface 绑定(bind)到包含当前绑定(bind)的事件调度程序(非伪造的事件调度程序)并将其作为参数传递的服务
  3. 应用程序启动后,您将事件调度程序与假事件调度程序交换,但是,您的 CartInterface 已经解析(因为它是单例)并且不知道事件调度程序已被交换

因此,CartInterface 仍然使用非伪造的事件调度程序,如果您尝试进行任何事件断言,您的测试就会失败。但是,如果您在 CartInterface 中使用 Event facade,事件调度程序将在您实际使用它时解析,这是在调度程序与假的。所以在这种情况下,您实际上得到了您想要的假事件并且您的测试通过了。

关于laravel - 测试 assertDispatched 仅在使用事件助手时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com