2017-02-21 10 views
0

Google Analytics API에 연결하고이 명령을 사용하여 데이터를 가져옵니다. 이것은 작동하지만 테스트를 작성하려고 시도하고 Google API 연결을 시뮬레이트하는 방법을 모릅니다. 내 첫 번째 생각은 문맥에서 Google API를 모의했지만이 명령을 명령에 주입하는 방법 이었습니까?Symfony 콘솔 명령 behat 테스트

/** 
* @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 
    } 
} 

내 두 번째 생각은 내가 특정 이벤트 발송자에 대한 서비스를 구글이 이벤트를 조롱에 연결할 때의 EventListener 및 변경 방법을 추가했다. 어떤 아이디어라도 도움이 될 것입니다.

+1

, 당신은 예를 들어, 테스트에서 모의 ​​클래스를 삽입 할 수 있도록 액세스가, 컨테이너 있습니다 : $ client = static :: createClient(); $ client-> getContainer() -> set ('google.client_conversion.factory', YourFactoryClass); –

+0

네, 맞습니다. 지금은 비슷한 것을 개발하고 있지만 service_test.yml을 특별한 클래스로 만들고 싶습니다. 서비스 : google.client_conversion.factory : 클래스 : ClientConversionFactoryMock 인수 : [ '% root_dir %/config/key/conversion_app .json '] –

+1

[symfony에서 동작하는 외부 API 조롱] (http://www.inanzzz.com/index.php/post/2blk/mocking-external-apis-with-behat-in-symfony) 및 [Mocking 내부 또는 외부 서비스 또는 API 호출 (behat)] (http://www.inanzzz.com/index.php/post/2y8u/mocking-internal-or-external-service-or-api-calls-with-behat) 앞으로 도움이 될 것입니다. – BentCoder

답변

1

내가 같이가 someting를 사용 : 내가 제대로 이해하면 당신은 당신의 테스트를 실행할 때

$client = static::createClient(); 

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

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

오, 좋아, 위의 코멘트에서 내 대답을 복사 한 다음 솔루션과 같이 제공하십시오. –