我有一个具有公共(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/