成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

寫Laravel測試代碼(三)

wdzgege / 537人閱讀

摘要:本文主要聊一聊寫測試時如何第三方數(shù)據(jù)。其實很簡單,只需運用庫請求代碼,從本地讀取數(shù)據(jù)。寫測試是非常重要的,需要會使用和這兩個基本庫,官網(wǎng)是手冊和手冊。

本文主要聊一聊寫測試時如何mock第三方json api數(shù)據(jù)。

在開發(fā)時經(jīng)常會調(diào)用第三方API接口,抓取json api data后進(jìn)行加工處理,那如何寫測試呢?如何mock數(shù)據(jù)呢?

這里舉一個簡單例子,AccountController::class調(diào)用Connector::class, Connector::class 會調(diào)用第三方 json api來讀取數(shù)據(jù),代碼如下:

getConnector();

        return $connector->call("accounts");
    }

    public function show(string $id)
    {
        $connector = $this->getConnector();

        return $connector->call("accounts/" . $id);
    }

    private function getConnector()
    {
        if (!$this->connector) {
            $this->connector = new Connector();
        }

        return $this->connector;
    }
}



namespace AppHttpControllers;

use GuzzleHttpClient;
use IlluminateHttpRequest;

class Connector
{
    public function call(string $path): array
    {
        $client = new Client();

        $response = $client->request(Request::METHOD_GET, config("app.url") . DIRECTORY_SEPARATOR . $path);

        return GuzzleHttpjson_decode($response);
    }
}

代碼很簡單,但是場景卻經(jīng)常會遇到,關(guān)鍵是如何mock數(shù)據(jù)而不是發(fā)送真實http請求數(shù)據(jù)。其實很簡單,只需運用Mockery庫mock請求代碼,從本地讀取fixtures數(shù)據(jù)

首先是在tests/fixtures文件夾下準(zhǔn)備下fixtures數(shù)據(jù),這些json文件的數(shù)據(jù)都是真實的接口返回的數(shù)據(jù),可以先用postman或其他工具拿到真實數(shù)據(jù), simple_dataset 是dataset的名稱,可以自定義,一般項目里都會有一個或多個dataset數(shù)據(jù)集,vendor 是第三方名稱,自定義:

然后寫上AccountControllerTest::class

call(Request::METHOD_GET, "api/v1/accounts");

        dump($response->json());
    }

    public function testShow()
    {
        $response = $this->call(Request::METHOD_GET, "api/v1/accounts/1");

        dump($response->json());
    }
}

然后寫上路由:

Route::group(["prefix" => "v1"], function () {
    $resources = [
        "accounts" => [AppHttpControllersAccountController::class => ["index", "show"]],
    ];

    foreach ($resources as $name => $controllers) {
        foreach ($controllers as $fqcn => $actions) {
            Route::resource($name, $fqcn, ["only" => $actions]);
        }
    }
});

既然用了全局類名AppHttpControllersAccountController::class,那就別忘了在app/Providers/RouteServiceProvider::mapApiRoutes 抹掉namespace

    protected function mapApiRoutes()
    {
        Route::prefix("api")
             ->middleware("api")
             ->group(base_path("routes/api.php"));
    }

最后同時在TestCase::class寫上mock數(shù)據(jù)代碼

getRelativePathname(), 0, -5); // remove ".json"

            // mock Connector::call("accounts/1") && Connector::call("accounts")
            $mock->shouldReceive("call")->with($api_name)->andReturn(GuzzleHttpjson_decode(file_get_contents($file->getRealPath()), true));
        }
    }
}

這樣執(zhí)行測試時就實現(xiàn)了讀取本地的真實json數(shù)據(jù),而不用發(fā)起真實的http請求。兩個測試的response數(shù)據(jù)的確來源于本地json文件的數(shù)據(jù):

其實,就是一句話,寫測試時如果調(diào)用了第三方 json api 讀取數(shù)據(jù)時,使用Mockery庫去mock數(shù)據(jù),數(shù)據(jù)來源于本地文件夾的數(shù)據(jù),且是真實有效的數(shù)據(jù)。至于mock部分的代碼想咋寫就咋寫。同時,上面代碼里還需要注意一點是,由于Connector::class是AccountController::class 的 hard dependency,別忘了加上 overload, 代碼里已經(jīng)添加鏈接,可看官網(wǎng)介紹

寫測試是非常重要的,需要會使用PHPUnit和Mockery這兩個基本庫,官網(wǎng)是PHP手冊和Mockery手冊。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25564.html

相關(guān)文章

  • 年前舊代碼的重構(gòu)、總結(jié)與反思

    摘要:最近在維護(hù)一個三年前的舊代碼,用的是框架。單元測試和語言并發(fā)控制實際上是個蛋疼的問題,夸張一點說,當(dāng)時的并不能特別輕松地實現(xiàn)并發(fā),甚至不能實現(xiàn)并發(fā)。語言的功能之一就是自帶單元測試。用語言之前,我的習(xí)慣是不寫單元測試。 最近在維護(hù)一個三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個代碼算是比較標(biāo)準(zhǔn)為了實現(xiàn)在規(guī)定的時間內(nèi)完成相關(guān)功能,同時程序員水平不高、經(jīng)過大量優(yōu)化之后,變...

    Shihira 評論0 收藏0
  • Laravel 測試代碼(五)

    摘要:寫一個,的是,的內(nèi)容參照寫測試代碼三,然后寫上很明顯,這里測試的是,即和,是一個自定義的,主要功能就是實現(xiàn)了全部,并保存在文件里作為。 本文主要探討寫laravel integration/functional test cases時候,如何assert。前面幾篇文章主要聊了如何reseed測試數(shù)據(jù),mock數(shù)據(jù),本篇主要聊下assert的可行實踐,盡管laravel官方文檔聊了Tes...

    xbynet 評論0 收藏0
  • Laravel 菜鳥晉級之路

    摘要:用也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。第二階段數(shù)據(jù)庫和開發(fā)了比較多的功能之后,會發(fā)現(xiàn)需要大量的測試數(shù)據(jù),這時候和就該大顯身手了。 用Laravel也有三四個月了,雖然是兼職開發(fā),但是使用的頻率非常之高,畢竟是產(chǎn)品化的一個項目。在這期間,也踩了無數(shù)的坑,走了很多彎路,所以準(zhǔn)備把最近的感悟記錄下來,方便后來者。 第一階段:簡單的增刪改查 這是最...

    YacaToy 評論0 收藏0
  • Laravel 中設(shè)計模式的實戰(zhàn)分享

    摘要:如何在實戰(zhàn)中能應(yīng)用上設(shè)計模式,我思考了接近兩年。最開始我接觸設(shè)計模式,出發(fā)點就是為了重構(gòu)代碼,以便更好的復(fù)用和測試。也就是說基本是被當(dāng)成一組靜態(tài)函數(shù)使用的。 MVC是Laravel自帶的,大家也多少都會用一些。今天我們不談MVC,談一些大中型項目的設(shè)計思路。 前言 雖然標(biāo)題說是設(shè)計模式,但是我并不打算去講什么singleton、strategy、factory,不知道為什么,每次看到...

    李義 評論0 收藏0
  • SegmentFault 社區(qū)訪談 | mcfog:自由進(jìn)出 Coding && A

    摘要:上次的訪談,介紹了下可愛的依云醬,回憶傳送門。這里簡單地介紹下龍女仆,全名小林家的龍女仆,為什么介紹這部劇呢因為設(shè)計獅顏值同學(xué)也安利了這部。劇情簡介在獨身又勞累的小林劃重點一名程序員身邊突然出現(xiàn)的穿著女仆服裝的美少女托爾。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的訪談,介紹了下可愛的依云醬,回憶傳送門。不...

    neroneroffy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<