【问题标题】:PHP Unit testing dispatched eventsPHP 单元测试调度事件
【发布时间】:2018-04-16 14:06:27
【问题描述】:

如何测试在函数调用期间分派了事件?

public function updateUser() {
    //Do some update stuff

    $event = new UserUpdated($user);

    $event->attach([
        new SendEmailAddressChangeEmail($emailAddress),
        new SendEmailAddressChangeEmail($oldEmailAddress),
    ]);
    $event->dispatch();
}

除了设置电子邮件地址并查看是否发送了电子邮件之外,我如何(使用 PHP 单元)检查调度程序是否实际上正在调度这些事件?我假设我需要创建某种模拟,但我不确定如何为完全不相关的代码创建模拟。

UserUpdated 事件代码:

class UserUpdated extends BaseEvent
{

    public $user;

    public function __construct(User $user) {
        $this->user = $user;
    }
}

以及相关的 SendEmailAddressChanged Handler 代码:

class SendEmailAddressChangeEmail implements Contracts\HandlerInterface
{
    protected $emailAddress;

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

    public function handle($event) {
        EmailUtils::sendEmailAddressChangeEmail($this->emailAddress, $event->user->userName, $event->user->userID);
    }
}

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    您拥有的updateUser() 方法合二为一,尤其不适用于(单元)测试:

    1. 业务逻辑
    2. 对象创建

    根据您自己的理解,我认为这也是您提出这个问题的原因。通常,不能直接测试的代码也是解决设计问题的好方法,因此通常最好用它来解决。

    这两点(1. 和 2.)是从 Misko Hevery 在他的清洁代码会谈中更详细地概述的“两堆”中借用的内容的过度简化:

    例如,在 2008 年 11 月的“The Clean Code Talks -- Inheritance, Polymorphism, & Testing”中 - https://youtu.be/4F72VULWFvc?t=1328(“Two Piles”@ 22:08)

    使该代码更具可测试性的一种解决方案是使用依赖注入。那是用户事件的一个工厂(方法)和对象updateUser()的一个工厂(方法)是一种方法。然后,该具体类型可以利用它注入的工厂对象来获取偶数对象。

    简而言之:如果该更新用户对象需要一个用户更新事件对象,它需要在其构造函数中请求它。

    由于您有时不想事先创建该用户更新事件对象,替代方法是注入一个知道如何创建该用户更新事件对象的对象,这类对象称为 factories .

    然后,测试可以注入一个工厂,该工厂呈现一个事件模拟对象,并期望它被调度。

    顺便说一句,一个好的调度库。确实已经为测试提供了现成的模拟,但这超出了 Phpunit 的范围。

    如果您还不了解 Phpunit 的模拟功能,请查看产品文档:

    【讨论】:

    • 这正是我所希望的响应类型。我有一种感觉,这个问题比测试更深入,但我不能完全确定它。感谢您的深入回复!我会考虑重构代码。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2020-11-11
    • 2019-10-09
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多