2017-02-21 36 views
0

У меня есть команда, и эта команда подключается к API Google Analytics и получает некоторые данные. Это работает, но я пытаюсь написать тест и не знаю, как имитировать соединение API Google. Моя первая идея заключалась в том, чтобы высмеять API Google в контексте, но как ввести этот макет в команду?Symfony console command 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 
    } 
} 

Моя вторая идея состояла в том, чтобы добавить EventListener и метод изменения при подключении к Google сервис для конкретного диспетчера событий и издеваться это событие. Любая идея будет очень полезна.

+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

[Mocking внешние APIs с behit в symfony] (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

Я использую коснуться, как это:

$client = static::createClient(); 

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

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

О, отлично, вы просто скопировали мой ответ из комментария выше, и дайте ему как решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^