【问题标题】:Mocking an object with internal dependencies in PHPUnit在 PHPUnit 中模拟具有内部依赖关系的对象
【发布时间】:2013-03-21 07:19:43
【问题描述】:

我对测试有点陌生,我想了解如何在现实世界场景中实施测试。例如,有这段代码实现了一个内部框架,并使用了方法链。乍一看,我认为 mocking 是最好的方法,但大多数例子都是这样:

public function someFunction(A $a)
{
    return $a * b;
}

但是,我正在测试的代码是这样的:

public function deleteUser($user_id)
{
    $user_id = (int)$user_id;
    $flag = Framework::getInstance()->request->get('delete') || false;

    if (!$this->exists($user_id)) {
        throw new UserException(UserException::NOT_EXIST);
    }

    return $this->delete([
        'id' => $user_id
    ]);
}

你会如何测试它?

我看过“Testing objects with dependencies in PHPUnit”,但修改实际代码不是一个选项。

【问题讨论】:

    标签: php unit-testing mocking phpunit


    【解决方案1】:

    简短的回答:您不能对该代码进行单元测试。由于静态方法调用,代码与Framework类耦合度太高,无法单独测试deleteUser()方法。 This article 关于使用单例的测试代码很好地描述了这种情况。

    答案很长,您无法对该代码进行单元测试,但您仍然可以创建有用的测试,例如集成测试或功能测试。您可以使用this question 作为参考,但基本上,在集成测试中,您可以同时测试代码的多个部分。 在这种测试中,您可以测试此方法的预期行为,即删除用户,而不用担心您的类的依赖关系。你想测试两个类(被测类和框架类)一起工作,所以你不需要模拟任何东西。

    说了这么多,为什么不能直接改代码呢?我强烈建议将依赖项注入到您的代码中(如第一篇文章中所述),而不是使用单例。

    【讨论】:

    • 嗯,它是公司框架,所以修改它并不是一个真正的选择。不过谢谢,在绞尽脑汁几天后,我得出了与您相同的结论……测试几乎是不可能的
    • 您可以尝试其他类型的测试,例如集成测试或功能测试。但是是的:单元测试是不可能的。如果回答对您有帮助,请不要忘记采纳! :)
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多