Каков наилучший подход к мокированию сторонних API во время написания тестов, чтобы избежать случайных вызовов и увеличить стабильность во время выполнения тестов?
Для создания моков в Yii2 Codeception для внешнего API в тестах REST API можно воспользоваться библиотекой Guzzle Mock Handler. Эта библиотека позволяет эмулировать ответы от внешнего API и управлять тестовыми сценариями.
Прежде всего, необходимо установить Guzzle Mock Handler в проект:
```
composer require --dev phpunit/phpunit guzzlehttp/guzzle guzzlehttp/promises guzzlehttp/psr7 guzzlehttp/guzzle
```
Затем создайте мок запрос со своими желаемыми данными для автоматического имитирования ответа в тестах REST API:
```php
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
$mock = new MockHandler([
new Response(200, ['X-Foo' => 'Bar'], 'Hello, World')
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
```
В вашем тестовом сценарии вы можете использовать созданный мок для отправки запросов к внешнему API:
```php
use GuzzleHttp\Exception\RequestException;
try {
$response = $client->request('GET', 'https://api.example.com');
$statusCode = $response->getStatusCode();
$body = $response->getBody()->getContents();
} catch (RequestException $e) {
$response = $e->getResponse();
$statusCode = $response->getStatusCode();
$body = $response->getBody()->getContents();
}
// Проверки результатов запроса
$this->assertEquals(200, $statusCode);
$this->assertEquals('Hello, World', $body);
```
Таким образом, вы можете эффективно создавать моки для внешнего API в тестах REST API с помощью Guzzle Mock Handler, что позволяет избежать случайных вызовов и обеспечивает стабильность выполнения тестов.
<b>Простой вариант</b> (костыли): <br/> <br/> Добавить в функциях, которые ожидают ответ от внешних сервисов, исключения для тестов <br/> <pre><code class="php">if (YII_ENV_TEST) {
return true;
}</code></pre> <br/> <br/> <b>Правильный вариант</b> : <br/> <br/> Зарегистрировать сервис внешних обращений в конфиге, в коде пользоваться только сервисом из контейнера <code class="php">Yii::$app->apiService</code> <br/> <br/> Cоздать загрулшку и зарегистрировать ее в качестве этого сервиса в тестовом конфиге <br/> <pre><code class="php"># config/test.php
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/web.php'),
[
'id' => 'app-tests',
'components' => [
'apiService' => [
'class' => 'App\Fake\ApiService',
],
],
],
);
return $config;</code></pre> <br/> Тестовый конфиг использовать в настройках модуля Codeception <br/> <pre><code class="yaml"># tests/integration.suite.yml
class_name: IntegrationTester
modules:
enabled:
- Asserts
- Yii2:
part: [orm, email, fixtures]
configFile: 'config/test.php'</code></pre>