Статьи

Принесите Ruby VCR для тестирования Javascript с Капибарой и пухлым Билли

Допустим, вы пишете приложение на Ruby . Вы, вероятно, общаетесь с каждым API под солнцем и с удовольствием пишете тесты, чтобы убедиться, что ваш код не дает ошибок.

Поскольку вы не хотите полагаться на сторонних разработчиков или на подключение к Интернету, чтобы пройти тесты или не пройти, вы все высмеиваете, скажем, Webmock . Это также делает ваши тесты  намного быстрее. Ведь даже самый быстрый интернет гораздо медленнее, чем процессор, говорящий с его памятью.

Если вам лень копировать все API под солнцем, вы можете использовать видеомагнитофон для записи запросов и их воспроизведения позже. Главное преимущество в том, что вам не нужно беспокоиться о тщательном переопределении  всего, и вы можете в любое время уничтожить записи, чтобы убедиться, что ваш код все еще работает против реального API.

Жизнь хороша.

Введите Javascript , левая сцена

Тогда Javascript становится все более заметным. Внезапно логика вашего приложения смещается с бэкенда на браузер, и, прежде чем вы это узнаете, большинство ваших тестов довольно неактуальны.

На какое-то время ты в порядке с капибарой или огурцом.

Запустите безголовый браузер, кликните по сайту, не выходя из RSpec , и убедитесь, что пользователи видят, что им нужно. Баланс восстановлен.

Затем вы добавляете форму оплаты. Или что-то. Внезапно ваш интерфейс общается с API. В случае Stripe или Balanced это даже особенность. Большое преимущество для пользователя.

jQuery(function($) {
  $('#payment-form').submit(function(event) {
    var $form = $(this);
 
    // Disable the submit button to prevent repeated clicks
    $form.find('button').prop('disabled', true);
 
    Stripe.createToken($form, stripeResponseHandler);
 
    // Prevent the form from submitting with the default action
    return false;
  });
});

Ну, это отстой, ты внезапно вернулся на круги своя.

Ваши тесты занимают минуты, чтобы выполнить. Ваши тесты не пройдут без подключения к интернету. Ваши тесты основаны на работоспособности сторонних сервисов. Ваши тесты отстой.

Кто хочет кодировать, когда выполнение ~ 5 тестов занимает 3 минуты? Никто.

Войдите в пыхтя Билли, правая сцена

Проблема в том, что ни Webmock, ни видеомагнитофон не могут обрабатывать запросы, исходящие из браузера, потому что они происходят в другом потоке, и они не могут возиться с ними.

К счастью, год назад Олли Смит создала пухлого Билли .

Идея была замечательной — раскрутить веб-прокси, попросить ваш безголовый браузер использовать его, когда ваш код отправляет запрос, он будет проходить через прокси-сервер, который попытается использовать Webmock для его обработки, в противном случае передать его на огромный интернет.

Но кто хочет издеваться над всем вручную?

За последние несколько недель я поставил перед собой задачу решить эту проблему и восстановить здравомыслие в моей жизни. Хорошие тесты прозрачны для приложения, и я буду проклят, если я использую любое из предложенных решений в Интернете, например:  «Ну, вы просто включаете в свой код переключатель, который знает, что вы находитесь в тесте, а затем не говорит». в полоску »

Да пошло оно.

Этим утром я отправил запрос на выдох для Билли .

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

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

Кэширование даже понимает, что некоторые URL-адреса без необходимости различаются при каждом запросе (социальные кнопки, аналитика и т. Д.), Поэтому вы можете настроить его так, чтобы эти запросы нормализовались для одной записи, которая воспроизводится каждый раз. Ваши тесты на самом деле не полагаются на то, что gAnalytics работает правильно?

И самое главное, вам даже не нужно менять свои тесты.

Вы добавляете что-то подобное в ваш spec_helper.rb :

Billy.configure do |c|
  c.cache = true
  c.ignore_params = ["http://www.google-analytics.com/__utm.gif",
                     "http://b.siftscience.com/i.gif",
                     "https://r.twimg.com/jot",
                     "http://p.twitter.com/t.gif",
                     "http://p.twitter.com/f.gif",
                     "http://www.facebook.com/plugins/like.php",
                     "https://www.facebook.com/dialog/oauth",
                     "http://cdn.api.twitter.com/1/urls/count.json"]
  c.persist_cache = true
  c.cache_path = 'spec/req_cache/'
end
 
# need to call this because of a race condition between persist_cache
# being set and the proxy being loaded for the first time
Billy.proxy.restore_cache
 
Capybara.javascript_driver = :poltergeist_billy

Тест для формы оплаты выглядит так же, как обычно:

    scenario "physical product" do
      product = start_buying build(:product, :physical, user: @seller, active: true)
 
      VCR.use_cassette('Balanced/purchase_with_cc') do
        within '#new_order' do
          fill_in 'order_email', with: Faker::Internet.safe_email
          fill_in_address
          fill_in_card
 
          click_on 'Buy Now'
        end
 
        page.should have_css('#receipt', :visible => true)
      end
 
      validate_receipt product, @seller
    end

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

Что вы ребята думаете? У меня всего 20 дней опыта работы с Ruby, и интернет сказал мне, что он действительно хочет что-то подобное, но я не смог найти никого, кто уже сделал это.