2016-06-10 2 views
1

Я поддерживаю веб-API, написанный на Ruby. Он подключается ко многим сторонним веб-службам. При написании тестов я блокирую любую функцию, которая должна была бы подключаться к сети и вместо этого возвращать данные в бутылках.Возможно ли предотвратить открытие экземпляра Ruby из сетевого соединения?

Это случилось со мной до этого, я забыл этот шаг ступени, и мои интеграционные тесты в конечном итоге фактически подключаются к стороннему сервису.

Учитывая это, я хотел бы запретить Ruby открывать сетевые подключения. Когда я попытался, я хотел бы, чтобы вместо этого я сделал исключение, указав, какую функцию я забыл заглушить.

Возможно ли это? Какую центральную функцию Ruby мне нужно было бы переопределить для достижения этого с минимальными другими побочными эффектами?

ответ

1

Что относительно WebMock? Вы попробовали? https://github.com/bblimke/webmock

Эта линия должна помочь:

WebMock.disable_net_connect!(allow_localhost: true) 
+0

Увы, это только отключает HTTP-соединения ... Библиотекам, таким как [ruby-ldap] (https://github.com/ruby-ldap/ruby-net-ldap), по-прежнему разрешено подключаться через TCP-соединения. – Hubro

1

Руководство раскорчевка, как вы только что сказали, ненадежны.

Лучшее решение может заключаться в том, чтобы обернуть ваш код, который вызывает внешние службы за фасадом, и использовать инъекцию зависимости, чтобы передать службу обработки веб-страниц в фасад при создании. Затем ваш тестовый комплект должен сделать то же самое с помощью заглушки. Вам нужно будет сделать это только один раз, и любой тест, который затем тестировал внешний код, будет использовать оштукатуренную службу.

+0

Хороший совет в целом, я думаю, но это не очень помогает мне сейчас. Я не хочу реорганизовывать всю свою базу кода, я просто хочу убедиться, что Ruby не сможет открыть какие-либо сетевые сокеты при выполнении модульных тестов. – Hubro

+0

Если вам понадобится рефакторинг всей базы кода, тогда есть основная проблема с базой кода, и, вероятно, она нуждается в рефакторинге. Ваше использование HTTP должно быть узким в единый метод, где было бы легко издеваться/перенаправить/подорвать. –

+0

@theTinMan Как я уже сказал, это просто HTTP, о котором я говорю, я говорю обо всех подключениях к сети, включая базовые соединения TCP/UDP. – Hubro

0

Отъезд VCR.

Во-первых, взгляните на its documentation и посмотрите, нужно ли это вам, и я полагаю, что это так. Мы использовали его в моей компании в течение нескольких лет, чтобы записать один HTTP-тест для спецификации и воспроизвести результаты для последующих тестов.

Мы обнаружили, что это имеет неоценимое значение при работе с внешними API.

Смежные вопросы