Преимущества шаблона Presenter для тестирования контроллера - PullRequest
2 голосов
/ 30 июня 2011

Я участвую в проекте, который экстенсивно использует шаблон Presenter.

Я не вижу его преимуществ, потому что все методы класса Presenter тривиальны, например:

class Checkout::NewPresenter

  def initialize(customer, order)
    @customer, @order = customer, order
  end

  def customer
    @customer
  end
  def order
    @order
  end
end

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

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

Iготовы Упрощение кода Ruby on Rails: шаблон Presenter, плагин ячейки и согласие только с первым случаем:

У вас есть логика в вашем представлении, которая широко использует ваши модели,В других взглядах нет места с такой логикой.Классическая рекомендация - переместить этот код в модель, но через короткое время ваши модели раздуваются с помощью глупых одноразовых вспомогательных методов.Решение: шаблон Presenter.

Я не понял второй случай.

Ваш конструктор содержит много кода для извлечения некоторых значений для ваших представлений из базы данных илидругое хранилище.У вас есть много фрагментов?вызовы, чтобы убедиться, что ваши данные не загружены, когда соответствующий фрагмент уже находится в кеше.Очень сложно протестировать конкретное действие из-за его размера.Решение: шаблон Presenter.

Опять же, при тестировании контроллеров мы изучаем только переменные экземпляра.Что они означают здесь

Основной вопрос - какие преимущества дает шаблон Presenter для тестирования контроллеров?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Ваш пример не похож на типичного докладчика.Обычно докладчик оборачивает одну модель, добавляя дополнительную логику, связанную с представлением (например, форматирование даты), как вы обычно делаете с помощью вспомогательного метода.

Каков контекст объекта Checkout, передается ли он в представление или используется в контроллере?

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

С другой стороны, если объект передается в представление, он выглядит как презентатор, который мало что делает.Может быть, только немного дальновидности, чтобы справиться с будущей сложностью.

0 голосов
/ 26 июля 2011

Я посмотрел на презентации Джея Филдса по шаблону Rails Presenter. Я нашел его примеры полезными, на самом деле я не смотрел на другие работы третьих лиц, особенно на тему Conductors.

Для меня преимущество состоит в том, чтобы отделить модели, то есть полную изоляцию от контроллеров и других моделей. Я думаю, что это лучший способ справиться с бизнес-логикой, так что контроллер остается тонким и ничего не знает о базовом хранилище данных и его структуре. Тем не менее, оригинальный Rails Presenter Pattern имел одну проблему, в которой он содержался. Объект презентатора - это просто то, что для представления данных он должен находиться между контроллерами и представлениями, поэтому проводники должны представлять дополнительный интерес, поскольку они располагаются между моделями и контроллерами.

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

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

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

...