测试assertDispatched仅在使用事件帮助程序时有效

时间:2018-01-16 14:35:44

标签: laravel testing events laravel-5

注册服务提供商

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')之类的事件助手即可恢复为绿色。

我并不是因为使用面向对象的方法而死,但我真的很好奇它在这里工作的原因,因为事件助手似乎在使用调度程序的一个实例就像我在注册服务时那样从容器中获取。

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

执行测试时会发生这种情况:

  1. laravel应用程序是自助的;它将非假事件调度程序绑定到服务容器
  2. CartInterface绑定到包含的服务并将当前绑定的事件调度程序(非虚假的调度程序)作为参数传递
  3. 应用程序已经自举,您将事件调度程序与假的调度程序交换,但是,您的CartInterface已经解决(因为它是单例)并且不知道事件调度程序已被交换
  4. 因此,CartInterface仍然使用非假事件调度程序,如果您尝试进行任何事件断言,则测试将失败。但是,如果您在Event内使用CartInterface外观,则在您实际使用它时将解析事件调度程序,这是在调度程序与伪造的调度程序交换之后。所以在这种情况下,你实际上得到了你想要的假冒事件,并且你的测试通过了。

相关问题