2010-10-04 33 views
4

J'ai un rubygem qui définit une classe SemanticFormBuilder personnalisée qui ajoute un nouveau type d'entrée Formtastic. Le code fonctionne comme prévu, mais je ne peux pas comprendre comment ajouter des tests pour cela. Je pensais que je pourrais faire quelque chose comme charger Formtastic, appelez semantic_form_for, puis l'entrée ad ann qui utilise mon type personnalisé :as, mais je n'ai aucune idée par où commencer.Comment tester une entrée personnalisée Formtastic avec rspec?

Est-ce que quelqu'un connaît des gemmes qui font quelque chose comme ça que je pourrais jeter un oeil à la source pour? Des suggestions sur où commencer?

Mon petit bijou nécessite Rails 2.3.x

La source de mon entrée personnalisée ressemble à ceci, et je l'inclure dans un initialiseur dans ma demande:

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 

Je ne sais pas si l'un des mon autre code source aiderait, mais il peut être trouvé ici http://github.com/beerlington/classy_enum

Répondre

3

Test de votre sortie

Notre équipe a eu du succès avec cette approche, Ith l'encre que nous avions initialement empruntée aux propres tests de Formtastic. Commencez par créer un tampon pour capturer la sortie que vous souhaitez tester.

# 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 

Ensuite, appelez semantic_form_for dans votre test, capturer la sortie à votre tampon. Une fois que vous avez fait cela, vous pouvez tester que la sortie était ce que vous attendiez.

Voici un exemple où j'ai remplacé StringInput pour ajouter une classe CSS integer aux entrées pour les propriétés de modèle d'entier.

# 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

Je ne sais pas si cette réponse fonctionne encore, il me semble continuer à courir dans ' « _routes » est pas disponible à partir d'un exemple (par exemple un bloc « il ») ou de constructions qui fonctionnent en la portée d'un exemple (par exemple . 'avant', 'let', etc.). Il est uniquement disponible sur un exemple de groupe (par exemple, un bloc 'describe' ou 'context'). ' Il se peut aussi que je fasse quelque chose d'arrogant. – counterbeing