3 回答

TA貢獻1852條經驗 獲得超7個贊
將 外部化到您自己的服務中,例如 ProjectService,并將其注入到 ApiManager 中。public function getProjects()
創建兩個版本的 ProjectService:ProjectService 和 ProjectMockService,首先當然用于生產,2nd 應該返回模擬值(無論你在這里需要什么)。
然后為生產和測試環境維護 services.yaml。根據活動環境的不同,將注入正確版本的 ProjectService。

TA貢獻1765條經驗 獲得超5個贊
理想情況下,您的應用程序應將來自第三方 API 的數據轉換為包含在您自己的應用程序中的模型。然后,應用程序應僅使用此模型的實例,而不是從 API 返回的數據。
這種抽象級別使測試更容易,因為只有一個地方使用API數據:在某種映射中。服務類可以從 API 獲取數據,然后映射器將響應轉換為域對象。
為了回答你的實際問題,我不會真正測試對API的HTTP調用。測試網絡調用會使測試套件變慢,并且在沒有網絡連接的環境中會失敗。相反,我會使用 API 中預先保存的或虛擬響應來測試映射器。如果 API 在某個時候開始以不同的“形狀”返回數據,則代碼中只有一個位置需要更改(映射層)。

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/
- 3 回答
- 0 關注
- 179 瀏覽
添加回答
舉報