注册服务提供商:
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');
}
结果:
The expected [cart.added] event was not dispatched.
如果不使用$this->events
来触发事件,我只需使用event('cart.added')
之类的事件助手即可恢复为绿色。
我并不是因为使用面向对象的方法而死,但我真的很好奇它在这里工作的原因,因为事件助手似乎在使用调度程序的一个实例就像我在注册服务时那样从容器中获取。
有任何线索吗?
答案 0 :(得分:0)
执行测试时会发生这种情况:
CartInterface
绑定到包含的服务并将当前绑定的事件调度程序(非虚假的调度程序)作为参数传递CartInterface
已经解决(因为它是单例)并且不知道事件调度程序已被交换因此,CartInterface
仍然使用非假事件调度程序,如果您尝试进行任何事件断言,则测试将失败。但是,如果您在Event
内使用CartInterface
外观,则在您实际使用它时将解析事件调度程序,这是在调度程序与伪造的调度程序交换之后。所以在这种情况下,你实际上得到了你想要的假冒事件,并且你的测试通过了。