【问题标题】:How to test that EventListener has been called on event in Symfony?如何测试在 Symfony 中的事件上是否调用了 EventListener?
【发布时间】:2017-06-26 06:10:22
【问题描述】:

我有什么:

我有一个监听 Symfony 中 PreRemove 实体事件的 EventListener。

services:
   my_bundle.entity_listener.my_listener:
      class: 'MyCompany\MyBundle\MyListener'
      public: false
      tags:
        - { name: doctrine.orm.entity_listener, entity: 'MyCompany\MyBundle\Entity\MyEntity', event: preRemove }

我想要什么:

我想要一个测试(功能/集成/单元或任何其他真正的)以某种方式检查 MyEntity 被删除时是否正在调用特定的 EventListener。

更新

我不想在单元测试中这样做,需要实际检查事件调度程序是否真的会调用该特定事件侦听器来处理该特定事件。

更新 2

我认为这很明显,但似乎不是 - 解决方案不应修改 EventListener 或 Event。

更新 3

我指定我不在乎测试的名称是什么:功能、单元或任何其他。

更新 4

解决方案必须保证测试将在任何环境的上下文中通过。因此,如果有人扩展了我的包并弄乱了我的定义,我仍然应该能够验证 EventHandling 是否真的有效。

此外,检查处理结果不是一种选择,因为:

  1. EventListener 绝对可以做任何事情 - 在某些情况下,我可能无法简单地检查结果并确定 EventListener 是否有效。

  2. 有人可能以几乎完全相同的方式处理一个事件,因此“结果”是相同的,但“方式”是错误的。

【问题讨论】:

  • 你不信任什么? Symfony Event Dispatcher 是否经过适当测试?还是您的应用程序配置正确?
  • 可能是第二个。但是,教义在事件监听方面存在许多陷阱和问题。稍后,我想通过测试插入聚合(例如)调用所需的偶数侦听器来强化我的测试条件。

标签: symfony doctrine


【解决方案1】:

功能测试是为了测试功能;它并非旨在测试该功能的实现或该实现的配置。

像你提议的那样的测试会很脆弱而且不是很有用。

您可能想要测试事件侦听器实现的功能。

【讨论】:

  • 我不在乎你称它为功能性或单位或任何东西。并在您回答后指定。我想要什么:我想要一个测试(功能/集成/单元或任何其他真正的),以某种方式检查当 MyEntity 被删除时,特定的 EventListener 被调用。不,这不是事件监听器实现的功能,不,它不会很脆弱。
  • 我工作的平台很大,很多人都在做。而且在任何时候任何事情都可能与服务定义发生冲突,因此测试定义是不可靠的。
【解决方案2】:

看看这个:Write UnitTest for Symfony EventListener

这可能会有所帮助,因为我有一个(某种)类似的问题/问题

【讨论】:

  • 感谢您的回复,但这并不能在具体环境中测试任何内容。 Bundle 可以扩展和弄乱,但测试应该仍然通过。这个单元测试没有任何保证。
【解决方案3】:

如何创建编译器通道并将其添加到容器编译的最后阶段:

$container->addCompilerPass(
    new CheckEntityListenerRegistered(),
    PassConfig::TYPE_AFTER_REMOVING,
    -1000
);

那个编译器会最后执行。您可以从那时开始检查您的侦听器是否已正确注册,如果是,您可以假设它将由 Doctrine 的工作单元执行。

【讨论】:

  • “如何创建一个加载完整配置的测试”,这实际上很有趣。怎么做呢?
  • 自定义编译器通过检查构建器怎么样?
  • 嗯,这不是测试,不是吗?您基本上是在建议编写一个工作代码来检查另一个工作代码是否已执行。
【解决方案4】:

我想我明白你想要什么。你想要一个集成测试(在所有环境中测试它)而不修改监听器、事件调度器等。

解决方案 1

当您从事开发、测试或生产工作时,symfony 会加载不同的事件调度程序,它使用相同的接口和行为,但实现方式不同(我没有检查原则之一)。

因此,您将为每个环境使用不同的调度程序,并且您不想知道内部发生了什么。我们称之为黑盒。

Action delete -> [ black box  ->  listener called ] -> listener effect

您不想看黑匣子或以任何方式触摸它吗?搜索在系统上有监听器的效果。数据库、日志文件、邮件程序等

解决方案 2

如果你允许我连接到你的黑盒中,我将使用代理来围绕监听器并监视是否已在代理上调用了监听器。

解决方案 3

您也可以使用 symfony 分析器中的数据收集器,但您可能不会在生产环境中启用它。

【讨论】:

  • 我想你最了解我想要什么。基本上,依赖注入将是我在这里的关键盟友(最重要的是 - 这是 di 最有用的特征之一),但我似乎无法在我的 WebTest 案例中替换我的定义。 Mb 你能提供一个解决方案吗?
  • 如何测试一个监听器被添加到 KernelEvents::TERMINATE 作为例子?
【解决方案5】:

也许你可以使用 symfony 分析器?

How to Use the Profiler in a Functional Test

在分析器事件部分,您有两个选项卡,其中包含已调用/未调用的侦听器 http://whatever.com/app_dev.php/_profiler/352211?panel=events

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 2016-04-28
    • 2017-12-15
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多