NEATweb
@NEATweb

Yii2 codeception REST API mock external API?

Приветствую всех!

Есть проблема, при написание тестов столкнулся с необходимостью мокать сторонние API сервисы чтобы они зря каждый раз не вызывались, суть в чем:

Это кусок кода из тестов:

public function signIn(ApiTester $I)
    {
        $data = [
            'phone' => '79999999999', 
            'token'  => '000000',
        ];

        $jsonData = json_encode($data);

        $I->sendPost('/sign-in', $jsonData);

        $I->seeResponseCodeIs(200);
        $I->seeResponseIsJson();
        $I->seeResponseMatchesJsonType([
            'token'      => 'string',
            'expires_at' => 'integer',
        ]);
    }


На эндпоинте котором проводится тест (/sign-in) есть запросы в другие API, к примеру получить данные по номеру телефона или отправить СМС код на телефон и т.п., необходимо все сторонние запросы замокать чтобы во время тестов ничего левого не вызывалось.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
vhood
@vhood
Не забывайте отмечать решения
Простой вариант (костыли):

Добавить в функциях, которые ожидают ответ от внешних сервисов, исключения для тестов
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'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы