Сегодня у Майкла было много отличных идей по отслеживанию людей через сайт, но я хотел быстро добавить функцию «спонсировать других пользователей». Я следовал логике понедельника, когда вывод конечной точки PayPal открыл некоторые потоки платежей. У меня был один человек, который ждал, чтобы использовать функцию «спонсировать других», и я обещал себе этап консолидации, как только это будет сделано. В довольно короткие сроки мы исключили несколько сценариев с огурцами:

Feature: Allow Users to Sponsor other members
  As a user
  So that I can help someone else get premium services
  I would like to be able to pay for their premium service
  Background:
    Given the following users exist
      | first_name | last_name | email                  | github_profile_url         | last_sign_in_ip |
      | Alice      | Jones     | [email protected] | http://github.com/AliceSky | 127.0.0.1       |
  Scenario: User upgrades another user from free tier to premium
    Given I am logged in
    And I visit Alice's profile page
    And I click "Sponsor for Premium"
    When I fill in appropriate card details for premium
    Then I should see "you have sponsored Alice Jones as a Premium Member"
    Given I visit Alice's profile page
    Then I should see "Premium Member"
    Then I should not see "Basic Member"
    Then I should not see "Sponsor for Premium"
    And I should not see "Upgrade to Premium"
  Scenario: non logged in user upgrades another user from free tier to premium
    Given I visit Alice's profile page
    And I click "Sponsor for Premium"
    When I fill in appropriate card details for premium
    Then I should see "you have sponsored Alice Jones as a Premium Member"
    Given I visit Alice's profile page
    Then I should see "Premium Member"
    Then I should not see "Basic Member"
    Then I should not see "Sponsor for Premium"
    And I should not see "Upgrade to Premium"

которые могли бы быть более декларативными, но на данный момент они были достаточно хороши. Затем мы напечатали еще более беспорядочный код, чтобы сделать их зелеными. Это все я. Я следовал своей мантре прошлой недели: «Озеленение, ТОГДА рефакторинг». Просто чтобы показать вам, насколько грязными были некоторые вещи, взгляните на это представление:

<% if @user.present? && current_user != @user %>
    <% if @plan == 'premium' %>
        <h2 id='payment_complete'>Thanks, you have sponsored <%= @user.display_name %> as a Premium Member!</h2>
        <p>You're seven day free trial has now started.  Your card will not be charged until seven days have passed.</p>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium membership benefits.</p>
    <% elsif @plan == 'premiummob'%>
        <h2 id='payment_complete'>Thanks, you have sponsored <%= @user.display_name %> as a Premium MOB Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium mob membership benefits.</p>
    <% elsif @plan == 'premiumf2f'%>
        <h2 id='payment_complete'>Thanks, you have sponsored <%= @user.display_name %> as a Premium F2F Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium f2f membership benefits.</p>
    <% else %>
        <h2 id='payment_complete'>Thanks, you have sponsored <%= @user.display_name %> as a Premium PLUS Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium plus membership benefits.</p>
    <% end %>
<% else %>
    <% if @plan == 'premium' %>
        <h2 id='payment_complete'>Thanks, you're now an AgileVentures Premium Member!</h2>
        <p>You're seven day free trial has now started.  Your card will not be charged until seven days have passed.</p>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium membership benefits.</p>
    <% elsif @plan == 'premiummob'%>
        <h2 id='payment_complete'>Thanks, you're now an AgileVentures Premium MOB Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium mob membership benefits.</p>
    <% elsif @plan == 'premiumf2f'%>
        <h2 id='payment_complete'>Thanks, you're now an AgileVentures Premium F2F Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium f2f membership benefits.</p>
    <% else %>
        <h2 id='payment_complete'>Thanks, you're now an AgileVentures Premium PLUS Member!</h2>
        <p>An AgileVentures mentor will be in touch shortly to help you receive all of your premium plus membership benefits.</p>
    <% end %>
<% end %>

Тьфу, бизнес-логика в представлении, многое нужно высушить, и теперь я снова смотрю на это, некоторые ошибки в формулировках. Однако все эти изменения будет довольно легко сделать. Опасность в том, что мы не доберемся до них. Мы с Майклом пошли на разборку «Кент Бек» и поменялись ролями. Куки, которые были зелеными для меня, теперь терпели неудачу для Майкла, терпели неудачу в CI и терпели неудачу, когда я возвращал их обратно на свою машину.

Казалось, что полный набор функций, связанных с Premium, не работает при запуске в полном пакетном режиме (iFrame Stripe не появляется), но будет работать при запуске по отдельности или из набора в их собственной папке (например, cucumber features/premium/*). В то время Майкл также получал отдельные сбои, связанные с повторно используемым токеном Stripe. У нас был небольшой беспорядок, и мы потратили большую часть часа на расследование. Возможно, что более важно, мы не занимались рефакторингом беспорядочного кода приложения!

Функционал работал, когда мы запускали сайт вручную. Так разочаровывает. Пытаюсь вытолкнуть что-то, чтобы получить немного денег, это работает вручную, но фич-тесты не проходят из-за какого-то странного бага, что оборачивается огромной тратой времени. Я хотел начать пробовать полосато-рубиновый макет, с которым ребята из CraftAcademy добились определенного успеха. Это не обязательно было мгновенным исправлением, но я начал по-настоящему ненавидеть все множество файлов фикстур, которые поставлялись с песочницей сложных сетевых взаимодействий. Случайные утечки кеша означают, что разработчики внезапно обнаружат в своей файловой системе множество дополнительных файлов. Запросы на вытягивание для новых функций будут иметь 112 измененных файлов вместо 12. Возможно, дисплей PR на GitHub можно было бы адаптировать для этого, но я действительно начал чувствовать, что все это доставляет больше хлопот, чем того стоит.

Майкл стремился понять эти ошибки и эти тесты. Мы перешли к конфигурации PuffingBilly, где я вспомнил, что был этот дополнительный шаг для игнорирования параметров уникального URL-адреса, сгенерированного взаимодействиями Stripe. Я снова получил тесты зелеными, но тогда они все еще не удались в пакетном режиме. Кроме того, Stripe сообщил нам, что их устраивает нагрузка на их тестовые серверы, которая находится «в пределах разумного». Поэтому на следующее утро я попытался отключить кэш видеомагнитофона и PuffingBilly от тестов, что сделало бы наши тесты чувствительными к сбоям в сети, просто чтобы посмотреть, сможет ли это заставить вещи проходить в пакетном режиме; но это все равно не удалось. Для теста требовался JavaScript, и я понял, что PuffingBilly жестко привязан ко всем тестам JS. Я мог бы удалить это и, возможно, смог бы пройти все тесты, но опять же…

Одна из самых больших проблем здесь — медленный цикл отладки. Если сбои происходят только в полном пакете, нам нужно запустить весь набор огурцов, что занимает десять минут. Это может показаться не таким уж большим, но это сжигает время. Я всегда видел в этом настоящий красный флаг. Застревание в медленном цикле отладки напрашивается на неприятности. Делайте все возможное, чтобы сократить время до получения обратной связи о том, работает ли внесенное вами изменение или нет! Я думаю, что следующее, что нужно попробовать, — это создать тег @no-billy, чтобы отказаться от определенных сценариев безголового кэширования javascript браузера, чтобы посмотреть, пройдет ли это. Другие варианты включают в себя драгоценный камень stripe-ruby-mock или просто отсутствие тестов на платежных частях, за что, как я слышал, выступают некоторые люди. Скрестим пальцы, чтобы сегодняшняя сессия была менее разочаровывающей…

ПОХОЖИЕ ВИДЕО

Первоначально опубликовано по адресу: http://nonprofits.agileventures.org/2016/11/03/frustratingly-slow-debug-cycle/