HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Инверсия зависимостей крайне мощная техника, которая работает не только с функциями, но и с объектами. Рассмотрим ее глубже на примере HTTP-запросов и познакомимся с таким понятием как<strong>заглушка</strong>(стабинг, stub).</p>
1 <p>Инверсия зависимостей крайне мощная техника, которая работает не только с функциями, но и с объектами. Рассмотрим ее глубже на примере HTTP-запросов и познакомимся с таким понятием как<strong>заглушка</strong>(стабинг, stub).</p>
2 <p>Предположим, что у нас есть функция, которая анализирует приватные репозитории организации на GitHub и возвращает те, что являются форками (репозитории, отпочкованные от основного репозитория):</p>
2 <p>Предположим, что у нас есть функция, которая анализирует приватные репозитории организации на GitHub и возвращает те, что являются форками (репозитории, отпочкованные от основного репозитория):</p>
3 <p>Давайте ее протестируем. Что мы хотим от этой функции? В первую очередь убедиться, что она работает правильно - возвращает массив приватных форков. Идеальный тест выглядел бы так:</p>
3 <p>Давайте ее протестируем. Что мы хотим от этой функции? В первую очередь убедиться, что она работает правильно - возвращает массив приватных форков. Идеальный тест выглядел бы так:</p>
4 <p>К сожалению, не все так просто. Внутри функции выполняется HTTP-запрос. Прикинем, какие проблемы из-за этого могут возникнуть:</p>
4 <p>К сожалению, не все так просто. Внутри функции выполняется HTTP-запрос. Прикинем, какие проблемы из-за этого могут возникнуть:</p>
5 <ol><li>Нестабильная сеть может тормозить выполнение тестов и приводить к фантомным ошибкам. Тесты будут иногда проходить, иногда нет</li>
5 <ol><li>Нестабильная сеть может тормозить выполнение тестов и приводить к фантомным ошибкам. Тесты будут иногда проходить, иногда нет</li>
6 <li>У сервисов подобных<em>github.com</em>установлены ограничения на запросы в секунду, в час, день и так далее. Со 100% вероятностью тесты начнут упираться в эти лимиты. Более того, есть шанс, что машина с которой идут запросы, будет заблокирована</li>
6 <li>У сервисов подобных<em>github.com</em>установлены ограничения на запросы в секунду, в час, день и так далее. Со 100% вероятностью тесты начнут упираться в эти лимиты. Более того, есть шанс, что машина с которой идут запросы, будет заблокирована</li>
7 <li>Реальные данные на GitHub не статичны, они могут и, скорее всего, будут меняться, что опять же приведет к ошибкам и необходимости править тесты</li>
7 <li>Реальные данные на GitHub не статичны, они могут и, скорее всего, будут меняться, что опять же приведет к ошибкам и необходимости править тесты</li>
8 </ol><p>В данном примере HTTP-запрос воспринимается как помеха к тому, чтобы протестировать нашу основную логику. Мы доверяем<em>github.com</em>и его библиотеке<em>@octokit/rest</em>, то есть нам не нужно проверять, что она работает правильно (иначе можно свихнуться, если не доверять никому).</p>
8 </ol><p>В данном примере HTTP-запрос воспринимается как помеха к тому, чтобы протестировать нашу основную логику. Мы доверяем<em>github.com</em>и его библиотеке<em>@octokit/rest</em>, то есть нам не нужно проверять, что она работает правильно (иначе можно свихнуться, если не доверять никому).</p>
9 <p>Из предыдущего урока мы узнали о нескольких способах выхода из этой ситуации и теперь можем применить один из них.</p>
9 <p>Из предыдущего урока мы узнали о нескольких способах выхода из этой ситуации и теперь можем применить один из них.</p>
10 <h2>Инверсия зависимостей</h2>
10 <h2>Инверсия зависимостей</h2>
11 <p>Для использования инверсии зависимости добавим вторым аргументом функции сам клиент<em>Octokit</em>. Это позволит подменить его в тестах:</p>
11 <p>Для использования инверсии зависимости добавим вторым аргументом функции сам клиент<em>Octokit</em>. Это позволит подменить его в тестах:</p>
12 <p>Нам придется реализовать фейковый (ненастоящий) клиент, который ведет себя примерно так же, как и реальный<em>Octokit</em>, за исключением того, что он не выполняет сетевых запросов. Также нам нужно описать конкретные данные, которые вернет вызов<em>listForOrg</em>. Только в таком случае мы сможем протестировать, что функция getPrivateForksNames() работает корректно.</p>
12 <p>Нам придется реализовать фейковый (ненастоящий) клиент, который ведет себя примерно так же, как и реальный<em>Octokit</em>, за исключением того, что он не выполняет сетевых запросов. Также нам нужно описать конкретные данные, которые вернет вызов<em>listForOrg</em>. Только в таком случае мы сможем протестировать, что функция getPrivateForksNames() работает корректно.</p>
13 <p>И сам тест с использованием этого клиента:</p>
13 <p>И сам тест с использованием этого клиента:</p>
14 <p>В тестировании для подобных фейковых объектов (или функций) есть специальное название - стаб (stub). Стаб заменяет реальный объект или функцию, позволяя избежать выполнения побочных эффектов или сделать код детерминированным. Стаб не используется для проверки чего-либо, он лишь позволяет изолировать ту часть, которая мешает тестированию основной логики.</p>
14 <p>В тестировании для подобных фейковых объектов (или функций) есть специальное название - стаб (stub). Стаб заменяет реальный объект или функцию, позволяя избежать выполнения побочных эффектов или сделать код детерминированным. Стаб не используется для проверки чего-либо, он лишь позволяет изолировать ту часть, которая мешает тестированию основной логики.</p>
15 <h2>Запрет HTTP-запросов</h2>
15 <h2>Запрет HTTP-запросов</h2>
16 <p>Другим способом предотвращения HTTP-запросов из тестов является их выключение в тестах. В следующих уроках мы познакомимся с библиотекой Nock, имеющей метод для запрета любых HTTP-запросов из кода: nock.disableNetConnect(). Рекомендуется вызывать его в начале файла с тестами. Помимо этого, он помогает увидеть, на какие страницы выполняют запросы сторонние библиотеки. Вот как выглядит вывод после выключения внешних соединений (при условии, что не выполнялась подмена запросов):</p>
16 <p>Другим способом предотвращения HTTP-запросов из тестов является их выключение в тестах. В следующих уроках мы познакомимся с библиотекой Nock, имеющей метод для запрета любых HTTP-запросов из кода: nock.disableNetConnect(). Рекомендуется вызывать его в начале файла с тестами. Помимо этого, он помогает увидеть, на какие страницы выполняют запросы сторонние библиотеки. Вот как выглядит вывод после выключения внешних соединений (при условии, что не выполнялась подмена запросов):</p>
17  
17