Symfony Console命令Behat测试



i具有命令,此命令连接到Google Analytics(分析)API并获取一些数据。这有效,但我尝试编写测试,不知道如何模拟Google API连接。我的第一个想法是在上下文中模拟Google API,但是如何将此模型注入命令?

/**
 * @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 Service到特定的事件调度程序并模拟此事件。任何想法都会非常有帮助。

我使用的是这样的:

    $client = static::createClient();
    $ldap = $this->getMockBuilder('AppBundleServicesSecurityLdapManager')
        ->disableOriginalConstructor()
        ->getMock();
    $client->getContainer()->set('app.ldap', $ldap);
    $crawler = $client->request('GET', '/');

最新更新