У меня есть команда, и эта команда подключается к 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 сервис для конкретного диспетчера событий и издеваться это событие. Любая идея будет очень полезна.
Если я правильно вас понял, когда вы запускаете тест, у вас есть доступ к нему это контейнер, так что вы можете попытаться вставить макет класса в тесте, например: $ client = static :: createClient(); $ client-> getContainer() -> set ('google.client_conversion.factory', YourFactoryClass); –
Да, у вас есть право. Прямо сейчас я что-то развиваю, но создаю специальный service_test.yml с издеваемыми классами, которые хочу заменить: сервисы: google.client_conversion.factory: класс: ClientConversionFactoryMock аргументы: ['% root_dir%/config/key/conversion_app .json '] –
[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