Php 一个只调用其他方法而不做任何其他事情的方法是一种代码味道吗?

Php 一个只调用其他方法而不做任何其他事情的方法是一种代码味道吗?,php,unit-testing,methods,Php,Unit Testing,Methods,假设我正在为某个第三方api编写一个包装器,我有这样一个方法: public function fetchSomeData() { $url = $this->makeUrl($someArgs); $response = $this->call($url); $this->save($response); return $response; } 一般来说,这是一种代码味道和糟糕的设计吗(考虑到我想测试这一点,并且里面的所有方法都是私有的),

假设我正在为某个第三方api编写一个包装器,我有这样一个方法:

public function fetchSomeData()
{
    $url = $this->makeUrl($someArgs);
    $response = $this->call($url);
    $this->save($response);

    return $response;
}

一般来说,这是一种代码味道和糟糕的设计吗(考虑到我想测试这一点,并且里面的所有方法都是私有的),以及重构这一点的好方法是什么?

比如说,如果编写一组通用方法来处理某些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);

不,这些东西不一定是代码味道。您可能确实希望在方法中对一些相关调用进行分组,以使其更易于使用

您不应该尝试测试
private
方法,而应该只测试
public
方法(因为
private
方法实际上是一种
public
方法,通过拆分它可以更容易地读取)

我不知道PHP,但在我看来,您试图发出一个webrequest,并且您以某种方式保存了响应。
这里重要的第一件事是,您必须将其作为单元测试而不是集成测试(集成测试也很重要,但这被标记为单元测试)。集成测试与代码之外的一些底层系统进行交互:文件系统、当前日期时间、webrequests、数据库等

一个很好的解决方案是创建一个由您的数据源(本例中是您的webrequest)继承的接口

现在,您可以通过构造函数或setter使用依赖项注入将数据源注入到类中

至于你关于如何测试这个的问题:你不测试私有方法。创建一个测试,将您的伪
IDataSource
注入到类中,使用您的参数调用它,查看它返回什么,并基于此执行断言

interface IDataSource {
    public function MakeUrl($args);
}