是一种只调用其他方法而不会产生代码味道的方法吗? [关闭]

问题描述 投票:0回答:2

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

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

    return $response;
}

这是一个代码气味和一般的糟糕设计(考虑到我想测试这个和内部的所有方法都是私有的),如果是什么是重构这个的好方法?

php unit-testing methods
2个回答
1
投票

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

你不应该试图测试private方法,只有public方法(因为private方法实际上只是一个public方法,通过拆分更容易阅读)。

我不知道PHP,但在我看来,你正在尝试进行webrequest,并以某种方式保存响应。 首先,重要的是你必须使它成为单元测试而不是集成测试(集成测试也很重要,但这被标记为单元测试)。集成测试与代码之外的某些底层系统交互:文件系统,当前日期时间,Web请求,数据库等。

一个很好的解决方案是创建一个由数据源继承的接口(在这种情况下是您的webrequest)。

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

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

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


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);
© www.soinside.com 2019 - 2024. All rights reserved.