2010-10-04 1 views
4

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

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

Мой драгоценный камень требует 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

ответ

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 в тесте, захватывая вывод в буфере. Как только вы это сделаете, вы можете проверить, что результат был тем, что вы ожидали.

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

# 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 
+0

Я не уверен, если этот ответ до сих пор работает, я, кажется, продолжает работать в '«_routes»не доступны из примера (например, 'это блок) или из конструкций, которые работают в сфера применения примера (например, . 'before', 'let' и т. д.). Он доступен только в примерной группе (например, блок «описать» или «контекст»). Возможно, очень хорошо, что я что-то делаю. – counterbeing