我正在尝试为连接到API的类编写一些单元测试。
我想要做的是更改类,以便不是实际连接到API,而是加载预先获取的常量夹具。实际执行cURL请求并返回数据的类中的方法受到保护,这是我想要更改的那个而不是返回fixture文件的内容。
我的问题是最好的方法是什么?
我在PHPUnit中读过关于模拟对象的内容,但是因为我想要更改的方法是内部的和受保护的,我认为我不能正确使用它们吗?
我是否正确地假设我需要扩展课程并自己更改方法?
感谢。
答案 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