einführung in ruby on rails

Monday, December 31st, 2007

auch wenn es schon diverse howtos und einführungen im internet zu ruby on rails gibt, habe ich mich entschlossen, eine von mir kürzlich zu dem thema erstellte präsentation hier zu veröffentlichen. ich hoffe es erleichtert dem ein oder anderen den einstieg in rails…

how to test view helpers in rails

Thursday, August 9th, 2007

as you probaby know, ruby on rails has a very handy test integration. you can easily write unit tests for your rich domain model and some functional tests (that can be roughly compared to http-units in the java world, but with integrated webserver) for the controller and views.

unfortunately, one part of rails basic implementation architecture cannot be tested as easy as the above mentioned components: the view helpers. actually they are used to extract view functionality and keep the view templates clean from ruby scriptlets. of course, you can test them indirectly through your functional tests, but rails provides no pure way to test them individually. an obvious approach is to write some unit-tests for each helper class. this works fine as long as you are not using some methods provided by rails, i.e. link_to, url_for, all the input tag methods and so on.

so here is an example of a simple view helper. the method time_link_to returns a link including the current date as parameter in the form http://www.yourhost.com/railscontroller/year/month/day.

# Methods added to this helper will be
# available to all templates in the application.
module ApplicationHelper

  def time_link_to(controller_name, name, date, html_options = nil)
    if html_options
      html_options = html_options.stringify_keys
      tag_options = tag_options(html_options)
      tag_options = nil
    url = url_for(:controller => controller_name) +
    "<a href=\"#{url}\"#{tag_options}>#{name || url}</a>"


since the method url_for is provided by the controller that is executed when the view and therefore the helper is evaluated, you have to fake it for the unit test. this can be done in the setup method of the unit test like this:

class ApplicationHelperTest < Test::Unit::TestCase

  include ActionView::Helpers::AssetTagHelper
  include ActionView::Helpers::UrlHelper
  include ActionView::Helpers::TagHelper
  include ApplicationHelper

  # called before every single test
  def setup
    # creating a dummy controller with the method url_for that
    # returns the url assigned to the controller
    @controller = Class.new do
      attr_accessor :url, :request
      def url_for(options, *parameters_for_method_reference)
    @controller = @controller.new
    # setting the url of the controller
    @controller.url = "http://www.example.com"

  # testing the view method
  def test_time_link_to
    assert_equal "<a href=\"http://www.example.com/testcontroller/" +
      "#{Date.today.year}/#{Date.today.month}/" +
      time_link_to("testcontroller", "test", Date.today)
    assert_equal "<a href=\"http://www.example.com/testcontroller/" +
      "#{Date.today.year}/#{Date.today.month}/" +
      "#{Date.today.day}\" id=\"test_id\">test</a>",
      time_link_to("testcontroller", "test",
        Date.today, {:id => "test_id"})