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


def my_helper(options = {})
  default_options = {
    :default1 => 123
  }

  render :partial => 'my_helper_partial', 
    :locals => {
      :options => default_options.merge(options)
    }
end

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

Шаг 1: переопределяем метод render, который вызывается внутри хелпера, таким образом, чтобы он перебрасывал переданные параметры на объект типа Proc. Этот объект будет являться нашим индикатором.


require File.dirname(__FILE__) + '/../../spec_helper'

describe MyHelper, "при генерации виджета изображений" do
  include MyHelper
  
  before :each do
    @render = Proc.new {}
  end

  def render(args)
    @render.call(args)
  end
end

Шаг 2: Формируем объект-индикатор


it "должен передавать дефолтное значение ключа :default1 в партиал" do
  @render = Proc.new do |args|
    args[:locals][:options][:default1].should = 123
  end
    
  my_helper
end

it "должен передавать заданное значение ключа :default1 в партиал" do
  @render = Proc.new do |args|
    args[:locals][:options][:default1].should = 456
  end
    
  my_helper :default1 => 456
end

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

А у вас есть велосипеды собственного изобретения? :) Если есть - делитесь ссылками!