Каков наилучший подход к мокированию сторонних 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, что позволяет избежать случайных вызовов и обеспечивает стабильность выполнения тестов.
Простой вариант (костыли):
Добавить в функциях, которые ожидают ответ от внешних сервисов, исключения для тестов
if (YII_ENV_TEST) { return true; }
Правильный вариант :
Зарегистрировать сервис внешних обращений в конфиге, в коде пользоваться только сервисом из контейнераYii::$app->apiService
Cоздать загрулшку и зарегистрировать ее в качестве этого сервиса в тестовом конфиге
# config/test.php $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/web.php'), [ 'id' => 'app-tests', 'components' => [ 'apiService' => [ 'class' => 'App\Fake\ApiService', ], ], ], ); return $config;
Тестовый конфиг использовать в настройках модуля Codeception
# tests/integration.suite.yml class_name: IntegrationTester modules: enabled: - Asserts - Yii2: part: [orm, email, fixtures] configFile: 'config/test.php'