2017-02-21 6 views
0

私はコマンドを持っており、このコマンドはgoogle analytics APIに接続してデータを取得します。これは動作しますが、テストを書いてみると、Google APIの接続をシミュレートする方法はわかりません。私の最初のアイデアは文脈でGoogleのAPIを模擬することでしたが、このモックをコマンドに注入する方法はありますか?Symfonyコンソールコマンドbehat test

/** 
* @inheritdoc 
* @param InputInterface $input 
* @param OutputInterface $output 
*/ 
public function execute(InputInterface $input, OutputInterface $output): void 
{ 
    //connect to google service 
    /** @var $googleClient \Google_Client*/ 
    $googleClient = $this->googleConnect(); 

    /** @var $shopTokenEntity TokenEntity */ 
    foreach ($tokensDataProvider as $shopTokenEntity) { 

     //refresh token if necessary 
     $this->refreshToken($googleClient, $shopTokenEntity); 

     $clientGA = new AnalyticsConversion($googleClient); 
     /** @var $analytics \Google_Service_Analytics*/ 
     $analytics = $clientGA->getAnalyticsService(); 

     try { 
      //do some other staff get data and save to db 

     } catch (\Google_Service_Exception $err) { 
      $this->getLogger()->addWarning($err->getMessage()); 
     } 
    } 
} 

/** 
* 
* @return \Google_Client 
*/ 
private function googleConnect(): \Google_Client 
{ 
    /** @var $conversionApp ClientConversionFactory */ 
    $conversionApp = $this->container->get('google.client_conversion.factory'); 
    /** @var $googleClient \Google_Client */ 
    $googleClient = $conversionApp->connect(); 

    return $googleClient; 
} 

/** 
* @param \Google_Client $googleClient 
* @param TokenEntity $tokenEntity 
*/ 
private function refreshToken(\Google_Client $googleClient, TokenEntity $tokenEntity): void 
{ 
    //set Auth 
    $googleClient->setAccessToken($tokenEntity->getAccessToken()); 
    //refresh and save token if needed 
    if ($googleClient->isAccessTokenExpired()) { 
     $this->getLogger()->addInfo("Refresh token for ShopID: " . $tokenEntity->getShopId()); 
     $googleClient->fetchAccessTokenWithRefreshToken(); 
     //save token to db 
    } 
} 

私の第二の考えは、私は、特定のイベントディスパッチャにサービスをGoogleとこのイベントを模擬するために接続したときのEventListenerと変更方法を追加しました。どんなアイデアも非常に役に立ちます。

+1

あなたのテストを実行するときには、例えば、テストであなたのモッククラスを挿入しようとすることができますので、あなたは、それのコンテナへのアクセス権を持っています: $ client = static :: createClient(); $ client-> getContainer() - > set( 'google.client_conversion.factory'、YourFactoryClass); –

+0

はい、あなたは正しいです。今私は似たようなものを開発していますが、私は交換したいと思っています。 サービス: google.client_conversion.factory: クラス:ClientConversionFactoryMock .json '] –

+1

[symfonyで動作する外部APIを嘲笑](http://www.inanzzz.com/index.php/post/2blk/mocking-external-apis-with-behat-in-symfony)と[Mocking内部または外部のサービスまたはapat呼び出しをbehat](http://www.inanzzz.com/index.php/post/2y8u/mocking-internal-or-external-service-or-api-calls-with-behat)将来的に役立つ。 – BentCoder

答えて

1

私はこのようにいろいろ書いを使用する:私が正しくあなたを理解している場合

$client = static::createClient(); 

    $ldap = $this->getMockBuilder('AppBundle\Services\Security\LdapManager') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    $client->getContainer()->set('app.ldap', $ldap); 
    $crawler = $client->request('GET', '/'); 
+0

ああ、あなたはちょうど上記のコメントから私の答えをコピーし、解決策のようにそれを与える。 –

関連する問題