Тестирование приложений Rails/Rack с использованием консоли rails

Мое упрощенное понимание стека Rails заключается в том, что он делает следующее (в общем):

  1. Ввод представляет собой HTTP-сообщение (GET, POST, PUT, DELETE, HEAD), URL-адрес, некоторые (необязательные) файлы cookie, (необязательный) токен сеанса и, возможно, некоторые данные, упакованные в формате JSON или XML.
  2. Это HTTP-сообщение обрабатывается Rack, который может запускать его через набор функций «промежуточного программного обеспечения», которые добавляют или удаляют данные из сообщения и могут использовать данные для добавления, изменения или удаления данных из хранилища данных программы.
  3. HTTP-сообщение на выходе Rack отправляется на маршрутизатор Rails, который сопоставляет его с контроллером, действием и хэшем параметров с информацией о сеансе, файлами cookie и другими параметрами. Данные отправляются соответствующему контроллеру.
  4. Метод контроллера анализирует параметры и алгоритмически объединяет их с данными из базы данных (через модели), при необходимости изменяет данные, а затем отправляет набор переменных, начинающихся с @, в шаблон представления.
  5. Шаблон представления берет данные и объединяет их с шаблоном представления для формирования представления в соответствующем формате (например, HTML, JS, JSON, XML и т. д.) или указывает вызывающей стороне (через код возврата HTTP) перенаправить на другой URL.

То, что я хотел бы сделать с моим веб-приложением Rails, используя консоль Rails,

  1. Составьте действительное HTTP-сообщение с URL-адресом, идентификаторами сеанса, файлами cookie и закодированными данными (JSON или XML).
  2. Вставьте эти данные в интерфейс Rack и проверьте, что выходит, прежде чем они будут отправлены на маршрутизатор Rails.
  3. Затем я хотел бы отправить эти данные на маршрутизатор Rails и посмотреть, что получится, прежде чем они попадут на контроллер.
  4. Затем я хотел бы отправить эти данные в контроллер и посмотреть, что получится, прежде чем они будут отправлены в шаблон представления.
  5. И затем я хотел бы взять эти данные и запустить их через шаблон представления и отобразить на STDOUT или автоматически открыть веб-браузер и увидеть, как они отображаются.

Существуют ли какие-либо существующие инструменты Rails, которые могут это сделать? Если нет, может ли кто-нибудь указать мне на код Rails, где встречаются эти интерфейсы?


person Jay Godse    schedule 27.11.2012    source источник


Ответы (1)


Большая часть того, что вы ищете, находится в библиотеке пакетов действий рельсов.

ActionDispatch обрабатывает интерфейс со стойкой, промежуточным ПО и маршрутизатором. Запрос попадает на маршрутизатор как последняя часть промежуточного программного обеспечения. Сам маршрутизатор вызывается в action_dispatch/routing/mapper. Поэтому, если вы хотите перехватить запрос до того, как он достигнет маршрутизатора, внедрите свое собственное промежуточное программное обеспечение до того, как будут вызваны маршруты.

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

Оттуда вы переходите к пакету действий. Рендеринг/перенаправление, которое вызывает ваш контроллер, устанавливает, что произойдет в пакете действий. Я не уверен, где именно AC звонит в AP, но вы должны быть в состоянии просеять его и найти путь, который вы ищете.

Что касается ответа, вы спиной к промежуточному программному обеспечению. Как только Rails сшивает представление, он в основном раскручивается и возвращается вниз по стеку промежуточного программного обеспечения, прежде чем отправить ответ обратно в Rack.

Надеюсь, это поможет.

person Cluster    schedule 28.11.2012
comment
Спасибо за ваше понимание. Я посмотрю на это. - person Jay Godse; 28.11.2012