在PHPUnit中模拟具有内部依赖关系的对象

时间:2013-03-21 07:19:43

标签: php unit-testing mocking phpunit

我对测试很陌生,我想了解在现实世界中如何实现测试。例如,有这个代码实现了一个内部框架,并采用方法链接。乍一看,我认为嘲笑是最好的方式,但大多数例子都是这样的:

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(array('id' => $user_id));
        }

你会如何测试?我看过了 [1]:在PHPUnit中测试具有依赖关系的对象

Testing objects with dependencies in PHPUnit

但它修改实际代码不是一种选择。

1 个答案:

答案 0 :(得分:3)

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

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

话虽如此,为什么你不能只改变代码?我强烈建议将依赖项注入代码(如第一篇文章中所述),而不是使用单例。