2012-04-15 14 views
7

Estoy escribiendo una biblioteca para envolver la funcionalidad de tsung de una manera que pueda ser mejor utilizada por las aplicaciones de rieles. Quiero escribir algunas pruebas de integración que se reducen a lo siguiente:Ejecutando un servidor web dentro de las pruebas de ruby ​​

  1. lanzamiento de un simple servidor web
  2. plazo Tsung-grabadora a través de la biblioteca
  3. selenio lanzamiento, con un perfil de Firefox configurado para utilizar el tsung proxy y tiene este traiga una página desde el servidor puesto en marcha en el paso 1
  4. examinar la biblioteca de grabado (que existe, está en el lugar correcto, etc.)

Para el paso 1, mientras que pude lanzar una vanil la aplicación lails externamente (por ejemplo, %x{rails s}), estoy bastante seguro de que hay una mejor manera de crear un servidor web simple y adecuado para las pruebas.

tl; dr - ¿Qué es una forma de lanzar mediante programación un servidor web simple dentro de una prueba?

+0

¿Solo usar Rack ?. –

+0

@NiklasB. Estaba pensando que eso funcionaría bien, pero no me es fácil encontrar un ejemplo (las pruebas en rack usan burlas de lo que puedo decir). –

+0

Hm, desafortunadamente no puedo señalarle un ejemplo mínimo, pero estoy seguro de que el capibara usa esto para sus especificaciones. Eche un vistazo a la implementación del servidor en https://github.com/jnicklas/capybara/blob/master/lib/capybara/server.rb y las especificaciones en https://github.com/jnicklas/capybara/blob/master /spec/server_spec.rb, son bastante informativos :) –

Respuesta

4

capibara utiliza un servidor de rack ad-hoc para sus especificaciones:

cualquier aplicación Rack (incluyendo aplicaciones Rails) puede ser servido el uso de este sistema, aunque la configuración de Rails puede ser un poco complicada.

+0

He utilizado 'Timeout.timeout (60) {@ server_thread.join (0.1) hasta que responda? } 'patrón, y funciona genial! ¡GRACIAS! –

9

Puede rodar su propio servidor simple. Aquí está un ejemplo rápido usando delgado y rspec (esas joyas, además de bastidor, debe estar instalado):

# spec/support/test_server.rb 
require 'rubygems' 
require 'rack' 

module MyApp 
    module Test 
    class Server 
     def call(env) 
     @root = File.expand_path(File.dirname(__FILE__)) 
     path = Rack::Utils.unescape(env['PATH_INFO']) 
     path += 'index.html' if path == '/' 
     file = @root + "#{path}" 

     params = Rack::Utils.parse_nested_query(env['QUERY_STRING']) 

     if File.exists?(file) 
      [ 200, {"Content-Type" => "text/html"}, File.read(file) ] 
     else 
      [ 404, {'Content-Type' => 'text/plain'}, 'file not found' ] 
     end 
     end 
    end 
    end 
end 

Luego, en su spec_helper:

# Include all files under spec/support 
Dir["./spec/support/**/*.rb"].each {|f| require f} 

# Start a local rack server to serve up test pages. 
@server_thread = Thread.new do 
    Rack::Handler::Thin.run MyApp::Test::Server.new, :Port => 9292 
end 
sleep(1) # wait a sec for the server to be booted 

Esto servirá cualquier archivo que almacena en la spec/support directorio. Incluyéndose a sí mismo. Para todas las demás solicitudes, devolverá un 404.

Esto es básicamente lo que hace el carpincho como se menciona en la respuesta anterior, sin mucha sofisticación.

+0

Puede haber un problema de seguridad aquí ... solo para estar seguro, cambiaría File.exists? línea a: 'File.exists? (file) && File.dirname (file) == @ root' – etipton

1

stub_server es un servidor de prueba real que puede servir respuestas predefinidas y es fácil de girar ... también viene con soporte SSL.

Cuestiones relacionadas