什么是PHPUnit测试的存根功能的正确方法?

时间:2010-10-26 12:32:00

标签: php unit-testing phpunit

我正在尝试为连接到API的类编写一些单元测试。

我想要做的是更改类,以便不是实际连接到API,而是加载预先获取的常量夹具。实际执行cURL请求并返回数据的类中的方法受到保护,这是我想要更改的那个而不是返回fixture文件的内容。

我的问题是最好的方法是什么?

我在PHPUnit中读过关于模拟对象的内容,但是因为我想要更改的方法是内部的和受保护的,我认为我不能正确使用它们吗?

我是否正确地假设我需要扩展课程并自己更改方法?

感谢。

1 个答案:

答案 0 :(得分:1)

Mocks和Stubs的目的是取代依赖于依赖性的功能,例如:当你有像

这样的东西时
class Foo
{
    public function __construct($apiConnector) {
        $this->apiConnector = $apiConnector
    }
}

其中$apiConnector是用于调用API的依赖项,然后使用您自己的实现存根或模拟该依赖项。由于该依赖关系是通过Foo的公共面向接口调用的,因此您可以在依赖关系中存根触发受保护方法的方法。

但是,如果没有依赖关系,但是对API的调用是从testclass进行的,那么你必须编写一个自定义类来扩展你的testclass并实现它自己的API调用函数,例如。

class FooMock extends Foo
{
    protected function queryAPI()
    {
        return $fixture;
    }
}

然后,您将测试此类而不是实际的类。

如果您的班级实际上是连接到WebService,请参阅章节Stubbing and Mocking WebServices