假设我正在为一些第三方api编写一个包装器,我有一个这样的方法:
public function fetchSomeData()
{
$url = $this->makeUrl($someArgs);
$response = $this->call($url);
$this->save($response);
return $response;
}
一般来说这是一个代码气味和糟糕的设计(考虑到我想测试这个并且里面的所有方法都是私有的),如果有什么好的方法可以重构这个?
答案 0 :(得分:1)
不,这些东西不一定是代码味道。您可能肯定希望在方法中对某些相关调用进行分组,以使其更易于使用。
您不应该尝试测试private
个方法,只测试public
个方法(因为private
方法实际上只是一个public
方法,通过拆分更容易阅读它)。
我不知道PHP,但在我看来,你正在尝试进行网络请求,并以某种方式保存响应。
首先,重要的是你必须使它成为单元测试而不是集成测试(集成测试也很重要,但这被标记为单元测试)。集成测试与代码之外的某些底层系统交互:文件系统,当前日期时间,Web请求,数据库等。
一个很好的解决方案是创建一个由数据源继承的接口(在这种情况下是你的webrequest)。
interface IDataSource {
public function MakeUrl($args);
}
现在您可以通过构造函数或setter使用依赖注入将数据源注入到类中。
关于如何测试这个的问题:你不测试私有方法。创建一个测试,将假的IDataSource
注入到类中,使用您的参数调用它并查看它返回的内容并根据它执行断言。
答案 1 :(得分:0)
假设你编写一套通用的方法来处理某些API而不是在类中创建执行某些API操作的函数。
并创建一个单独的文件,如控制器文件。 并在此控制器文件中创建API类的对象,并根据您的需要调用其方法,并根据您的业务逻辑。
所以而不是
public function fetchSomeData()
{
$url = $this->makeUrl($someArgs);
$response = $this->call($url);
$this->save($response);
return $response;
}
你应该创建一个.php文件并创建像
这样的对象$obj = new APIClass();
而不是像这样
$url = $obj->makeUrl($someArgs);
$response = $obj->call($url);
$obj->save($response);