2016-02-03 27 views
0

我正在使用Symfony中的功能测试测试控制器操作。在这个测试中,我正在做这样的事情:如何在功能测试中测试事件是否已发出

$client->request(
    'PUT', 
    '/api/nodes/', 
    $data 
); 

之后,我想测试某个事件是否已分派。我已经尝试过让以前分析器(并设置相应的配置),并检查数据的EventDataCollector

$client->enableProfiler(); 
$client->request(
    'PUT', 
    '/api/nodes/' . $data[0]['id'] . '?webspace=sulu_io&language=en', 
    $data[0] 
); 

/** @var EventDataCollector $eventDataCollector */ 
$eventDataCollector = $client->getProfile()->getCollector('events'); 

可正常工作,但问题是,$eventDataCollector只包含有关事件的数据,其一些听众实际上已经被执行。幸运的是,在这个特定情况下执行了一个事件监听器,但是我希望在没有任何事件监听器的情况下工作,因为我不能肯定地说这种情况会继续如此。

所以我的问题是,如果有一种方法来测试事件是否派发,即保存,即使没有附加事件监听器。

回答

2

您只能在您的测试环境中注册事件侦听器/订阅者。其唯一目的是让您检查事件是否被解雇。

+0

尝试使用'$ client-> get('event_dispatcher') - > addEventListener(...)'来做到这一点,但是自从有一段时间我遇到内核似乎为每个请求重置的问题......会很好在这个单独的测试中只包含这个监听器,我想你建议通过配置添加监听器,对吧? –

+0

是的。取决于测试套件的组织方式和测试内容。如果您使用来自Symfony项目的内核进行测试,则需要在项目级别(测试环境)注册它。您也可以创建专门用于测试的内核。如果你正在隔离测试一个包,这很有用。 –

1

Yagni。功能测试应基于规格,例如发送一些数据到PUT /api/nodes/ HTTP/1.1应该对API消费者产生一些(理想的)有价值的结果。我猜想有些数据操作。测试应确认输出符合特定数据排列的预期。

事件监听是您的黑匣子的内部实现,并且不是功能测试的主题。应该孤立地进行测试。启用分析器,基本上可以更改被测系统,并最终测试与生产代码仅部分相关的内容。

+0

那么,规范的一部分就是调度一个事件,以便其他开发人员可以对它做出反应。如果开发一个框架,这一点尤其重要,所以它不是黑盒子的内部实现,而是外部开发人员会依赖的东西。 –

+0

啊,我明白了。然后你需要嘲笑偶数的消费者,并声明它被调用。 –

相关问题