2010-05-21 7 views
13

Estoy escribiendo una aplicación sinatra y probándola con rspec y rack/test (como se describe en sinatrarb.com).
Hasta ahora ha sido genial, hasta que cambié el código de procedimientos de mis objetos de dominio a sinatra helpers.¿Cómo puedo probar los bloques de ayudantes en Sinatra, usando Rspec?

Desde entonces, he estado tratando de averiguar cómo probarlos de forma aislada.

Respuesta

0

También he intentado esto (que necesita ser limpiado un poco para ser reutilizable) para aislar cada ayudante en su propio entorno del test:

class SinatraSim 
    def initialize 
    ...set up object here... 
    end 
end 

def helpers(&block) 
    SinatraSim.class_eval(&block) 
end 

require 'my/helper/definition' # defines my_helper 

describe SinatraSim do 
    subject { SinatraSim.new(setup) } 

    it "should do something" 
    subject.expects(:erb).with(:a_template_to_render) # mocha mocking 
    subject.my_helper(something).should == "something else" 
    end 
end 
12

pongo a prueba mis ayudantes Sinatra en forma aislada, poniendo el métodos de ayuda dentro de su propio módulo. Dado que mi aplicación sinatra es un poco más grande que el hola mundo ejemplo, tengo que dividirlo en partes más pequeñas. Un módulo para los ayudantes comunes se adapta bien a mi caso de uso.

Si escribe una demostración rápida, y define sus métodos de ayuda en el bloque helpers { ... }, no creo que la prueba sea absolutamente necesaria. Cualquier aplicación de sinatra en producción, puede requerir más modularidad de todos modos.

# in helpers.rb 
module Helpers 
    def safe_json(string) 
    string.to_s.gsub(/[&><']/) { |special| {'&' => '\u0026', '>' => '\u003E', '<' => '\u003C', "'" => '\u0027'}[special] } 
    end 
end 

# in app.rb 
helpers do 
    include Helpers 
end 

# in spec/helpers_spec.rb 
class TestHelper 
    include Helpers 
end 

describe 'Sinatra helpers' do 
    let(:helpers) { TestHelper.new } 

    it "should escape json to inject it as a html attribute" 
    helpers.safe_json("&><'").should eql('\u0026\u003E\u003C\u0027') 
    end 
end 
Cuestiones relacionadas