亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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中的數據如下所示:[   0 => [           'id' => 1,           'title' => 'Project #1',           'description' => 'Project description...'        ],   1 => [           'id' => 2,           'title' => 'Project #2',           'description' => 'Project description...'        ],]當然,我不想用來自API的真實數據進行測試。如何模擬從 getProjects 中的 HTTP 請求返回的數據?
查看完整描述

3 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

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

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

然后為生產和測試環境維護 services.yaml。根據活動環境的不同,將注入正確版本的 ProjectService。


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

TA貢獻1765條經驗 獲得超5個贊

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

這種抽象級別使測試更容易,因為只有一個地方使用API數據:在某種映射中。服務類可以從 API 獲取數據,然后映射器將響應轉換為域對象。

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


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

TA貢獻1785條經驗 獲得超8個贊

在這種特定情況下,您不需要任何花哨的東西。您已經擁有依賴項(我希望您通過以下方式接收)。如果是這種情況,請繼續模擬單元測試您的方法。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);

    }

}

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


查看完整回答
反對 回復 2022-08-05
  • 3 回答
  • 0 關注
  • 179 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號