php - 如何对一个方法进行单元测试,该方法调度改变被测方法行为的事件?

标签 php unit-testing phpunit drupal-8

我有一个具有公共(public)属性的自定义事件:

class MyCustomEvent
{
    public $allowAction = false;
}

我有一个类,它创建此事件,并使用事件对象调度事件,允许事件监听器/订阅者更改对象的属性。

class MyBizLogic
{
    private $dispatcher;

    public function __construct(EventDispatcher $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    public function doSomething()
    {
        $event = new MyCustomEvent();
        $dispatcher = $this->dispatcher->dispatch('my_custom_event', $event);
        if ($event->allowAction) {
            // do action
        } else {
            // do something else
        }
    }
}

如何对doSomething进行单元测试?我需要一种方法来控制事件对象的属性,但事件对象不是我可以模拟的依赖项。它是在我正在测试的方法中创建的。

我不认为这是一种设计味道,因为这就是大多数开发人员调度事件的方式。我可以在这里做什么来正确测试 doSomething 应该处理的不同结果?

最佳答案

答案:只需创建一个将用于测试的可配置监听器,并使其在每种情况下按照您想要的方式运行。


不要这样做!这里的设计味道是事件接收者不应该能够改变发出事件的方法的逻辑。如果有 2 个听众怎么办?其中一个可以设置一个值,另一个可以设置另一个值?最后一个将获胜,而第一个听众并不知道这一点。

事件是一种通知其他对象的方式,而发出实体不知道谁将监听(可能没有其他对象)。对于有多少听众,发射器应该以相同的方式工作。如果您需要让其他对象控制逻辑的某些方面,请明确执行(如果有疑问,请写另一个问题,我们会尽力提供帮助)

关于php - 如何对一个方法进行单元测试,该方法调度改变被测方法行为的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096663/

相关文章:

laravel - 如何测试失败后一定时间后发布的工作?

symfony - phpunit 中的错误状态代码

php - Zend Framework 2 中使用 PHPUnit 模拟服务

php 检查 session 是否足够安全?

php - 通过 Google Places API 解析地址

php - json_encode 是否足够的 XSS 保护?

javascript - 使用 webpack 的 require.ensure 函数为 javascript 模块编写测试

delphi - 如何模拟没有虚拟方法的类?

php - Laravel 单元测试 - 如何检查验证规则或类?

php - rabbitmq 在 linux 中发送数据 php