Как проверить пользовательский ввод Formtastic с помощью rspec? - PullRequest
4 голосов
/ 05 октября 2010

У меня есть rubygem, который определяет пользовательский класс SemanticFormBuilder, который добавляет новый тип ввода Formtastic. Код работает, как и ожидалось, но я не могу понять, как добавить тесты для него. Я думал, что мог бы сделать что-то вроде загрузки Formtastic, вызвать semantic_form_for, а затем ввести объявление ad ann, использующего мой собственный тип :as, но я не знаю, с чего начать.

Кто-нибудь знает какие-нибудь драгоценные камни, которые делают что-то подобное, на что я мог бы взглянуть на источник? Любые предложения о том, с чего начать?

Мой драгоценный камень требует Rails 2.3.x

Источник для моего пользовательского ввода выглядит следующим образом, и я включаю его в инициализатор в моем приложении:

module ClassyEnumHelper
  class SemanticFormBuilder < Formtastic::SemanticFormBuilder
    def enum_select_input(method, options)
      enum_class = object.send(method)

      unless enum_class.respond_to? :base_class
        raise "#{method} does not refer to a defined ClassyEnum object" 
      end

      options[:collection] = enum_class.base_class.all_with_name
      options[:selected] = enum_class.to_s

      select_input(method, options)
    end
  end
end

Не уверен, что любой другой мой исходный код поможет, но его можно найти здесь http://github.com/beerlington/classy_enum

1 Ответ

3 голосов
/ 15 мая 2012

Тестирование вашего вывода

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

Сначала создайте буфер для захвата вывода, который вы хотитеtest.

# spec/support/spec_output_buffer.rb
class SpecOutputBuffer
  attr_reader :output

  def initialize
    @output = ''.html_safe
  end

  def concat(value)
    @output << value.html_safe
  end
end

Затем вызовите semantic_form_for в своем тесте, захватив выходные данные в ваш буфер.Как только вы это сделаете, вы можете проверить, что выходные данные оказались такими, как вы ожидали.

Вот пример, где я переопределил StringInput, чтобы добавить integer CSS-класс для входных данных для целочисленных свойств модели.

# spec/inputs/string_input_spec.rb
require 'spec_helper'

describe 'StringInput' do

  # Make view helper methods available, like `semantic_for_for`
  include RSpec::Rails::HelperExampleGroup

  describe "classes for JS hooks" do

    before :all do
      @mothra = Mothra.new
    end

    before :each do
      @buffer = SpecOutputBuffer.new
      @buffer.concat(helper.semantic_form_for(@mothra, :url => '', as: 'monster') do |builder|
        builder.input(:legs).html_safe +
        builder.input(:girth).html_safe
      end)
    end

    it "should put an 'integer' class on integer inputs" do
      @buffer.output.should have_selector('form input#monster_legs.integer')
    end
  end
end
...