4

新しい Formtastic 入力タイプを追加するカスタム SemanticFormBuilder クラスを定義する ruby​​gem があります。コードは期待どおりに機能しますが、テストを追加する方法がわかりません。Formtastic をロードし、semantic_form_for を呼び出してから、カスタム:asタイプを使用する入力を追加できると考えていましたが、どこから始めればよいかわかりません。

ソースを調べることができる、このようなことをする宝石を知っている人はいますか? どこから始めるべきかについて何か提案はありますか?

私の gem には 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

4

1 に答える 1

3

出力のテスト

私たちのチームは、このアプローチで成功を収めています。これは、もともと Formtastic 自身のテストから借用したものだと思います。

最初に、テストする出力をキャプチャするためのバッファーを作成します。

# 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て、出力をバッファーにキャプチャします。それが完了したら、出力が期待どおりであることをテストできます。

integerこれは、整数モデル プロパティの入力に CSS クラスを追加するために StringInput をオーバーライドした例です。

# 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
于 2012-05-15T19:59:55.267 に答える