Php 一个只调用其他方法而不做任何其他事情的方法是一种代码味道吗?
假设我正在为某个第三方api编写一个包装器,我有这样一个方法: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; } 一般来说,这是一种代码味道和糟糕的设计吗(考虑到我想测试这一点,并且里面的所有方法都是私有的),
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);
}