第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何測試與第三方 API 交互的服務?

如何測試與第三方 API 交互的服務?

PHP
慕田峪9158850 2022-08-05 10:42:00
我有以下服務要測試:namespace App\Service;class ApiManager{   public function getProjects()   {      $projects = $this->pager->fetchAll(                $this->client->api('projects'),                'all',                [['simple' => true]]      );   }}該服務使用用于 PHP 的 Gitlab API 捆綁包。因此,$projects中的數(shù)據(jù)如下所示:[   0 => [           'id' => 1,           'title' => 'Project #1',           'description' => 'Project description...'        ],   1 => [           'id' => 2,           'title' => 'Project #2',           'description' => 'Project description...'        ],]當然,我不想用來自API的真實數(shù)據(jù)進行測試。如何模擬從 getProjects 中的 HTTP 請求返回的數(shù)據(jù)?
查看完整描述

3 回答

?
慕姐4208626

TA貢獻1852條經(jīng)驗 獲得超7個贊

將 外部化到您自己的服務中,例如 ProjectService,并將其注入到 ApiManager 中。public function getProjects()

創(chuàng)建兩個版本的 ProjectService:ProjectService 和 ProjectMockService,首先當然用于生產(chǎn),2nd 應該返回模擬值(無論你在這里需要什么)。

然后為生產(chǎn)和測試環(huán)境維護 services.yaml。根據(jù)活動環(huán)境的不同,將注入正確版本的 ProjectService。


查看完整回答
反對 回復 2022-08-05
?
POPMUISE

TA貢獻1765條經(jīng)驗 獲得超5個贊

理想情況下,您的應用程序應將來自第三方 API 的數(shù)據(jù)轉(zhuǎn)換為包含在您自己的應用程序中的模型。然后,應用程序應僅使用此模型的實例,而不是從 API 返回的數(shù)據(jù)。

這種抽象級別使測試更容易,因為只有一個地方使用API數(shù)據(jù):在某種映射中。服務類可以從 API 獲取數(shù)據(jù),然后映射器將響應轉(zhuǎn)換為域?qū)ο蟆?/p>

為了回答你的實際問題,我不會真正測試對API的HTTP調(diào)用。測試網(wǎng)絡(luò)調(diào)用會使測試套件變慢,并且在沒有網(wǎng)絡(luò)連接的環(huán)境中會失敗。相反,我會使用 API 中預先保存的或虛擬響應來測試映射器。如果 API 在某個時候開始以不同的“形狀”返回數(shù)據(jù),則代碼中只有一個位置需要更改(映射層)。


查看完整回答
反對 回復 2022-08-05
?
慕的地10843

TA貢獻1785條經(jīng)驗 獲得超8個贊

在這種特定情況下,您不需要任何花哨的東西。您已經(jīng)擁有依賴項(我希望您通過以下方式接收)。如果是這種情況,請繼續(xù)模擬單元測試您的方法。Pager__construct()$this->pager->fetchAll()


如下所示:


ApiManagerTest.php


class ApiManagerTest extends TestCase

{

    private $pager;


    private $apiManager;


    public function setUp(): void

    {

        $this->pager = $this->prophesize(Pager::class);


        // Notice we pass the mocked `pager` object here

        $this->apiManager = new ApiManager(

            $this->pager->reveal()

        );

    }


    public function testGetProjects(): void

    {

        // Given

        $projects = $this->givenTwoProjectsExist();


        $this->pager->getProjects(

            'projects',

            'all',

            [['simple' => true]]

        )

        ->shouldBeCalledOnce()

        ->willReturn($projects);


        // When

        $result = $this->apiManager->fetchAll();


        // Then

        self::assertEquals($projects, $result);

    }

}

您可以在此處閱讀有關(guān)“給定,何時,然后”結(jié)構(gòu)的更多信息:https://thephp.website/en/issue/clean-tests-with-php-and-phpunit/


查看完整回答
反對 回復 2022-08-05
  • 3 回答
  • 0 關(guān)注
  • 186 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號