iT邦幫忙

0

Laravel9 的 PHPUnit 無法對 GuzzleHttp\Client Mock

  • 分享至 

  • xImage
  • test
class test_api_getToken()
{
    $this->mock(\GuzzleHttp\Client::class);
    $api_class = $this->app->make(\App\ApiClass::class);
}
  • class
class ApiClass
{
    private $guzzle;
    
    public function __construct()
    {
        dd(
            get_class(app(Client::class)),
            get_class(app(Client::class, ['config' => ['verify' => false]]))
        );
        /**
         *    Mockery_0_GuzzleHttp_Client
         *    GuzzleHttp\Client
         */
    }
}

想請教怎麼樣才能置換到第二個Client

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
woeichern
iT邦新手 1 級 ‧ 2022-09-29 23:21:41

應該是要用依賴注的方式:

  • class

user GuzzleHttp\Client;

class CpsService
{
    private $guzzle1;
    private $guzzle2;
    
    public function __construct(Client $guzzle1, Client $guzzle2)
    {
        $this->guzzle1 = $guzzle1;
        $this->guzzle2 = $guzzle2;
    }
}
  • test
class test_api_getToken()
{
    $client = new Client();
    $client2 = new Client(['config' => ['verify' => false]]);
    $service = new CpsService($client1, $client2);
    
    // 下略
}

這樣我實際使用的情境就很怪了,我要用 ApiClass 的時候,我還要先另外 new \GuzzleHttp\Client ?

這樣會變成為了測試而讓原本程式使用上變得不方便吧。

woeichern iT邦新手 1 級 ‧ 2022-09-30 22:11:44 檢舉

你可以用 $service = app(CpsService::class);

這其實不算是為了測試而讓原本程式使用上變得不方便吧。
而是提高程式的可測試性XD

我要發表回答

立即登入回答