2010-01-28 19 views
17

Escribí un pequeño programa que usa Mechanize para recorrer un sitio.Cómo probar una aplicación de ruby ​​que utiliza mecanizar

Quiero escribir pruebas para ello, pero no quiero que realmente inicie sesión en el sitio cada vez que ejecuto las pruebas. Me gustaría burlarme de Internet, de modo que cuando vaya a algún sitio, simplemente devuelva los resultados almacenados.

Aquí hay un pequeño ejemplo, pretendo que el propósito de mi código era sacar enlaces de la página de inicio de google, así que escribo una prueba para asegurar que el primer enlace que mi código encuentre tenga el texto "Imágenes". Yo podría escribir algo como esto:

require 'rubygems' 
require 'mechanize' 
require 'test/unit' 

def my_code_to_find_links 
    google = WWW::Mechanize.new.get('http://www.google.com') 
    # ... 
    # some code to figure out which liks it wants 
    # ... 
    google.links 
end 

class TestGoogle < Test::Unit::TestCase 
    def test_first_link_is_images 
    assert_equal 'Images' , my_code_to_find_links.first.text 
    end 
end 

¿Cómo se burlan de google.com para que pueda probar my_code_to_find_links sin toda la sobrecarga de realidad acceso a internet?

gracias -Josh

Respuesta

35

Uso Fakeweb a trozo las respuestas de internet.

Para el ejemplo de Google, primero vaya al sitio web y guarde el html de la página que desee. En este caso, asumamos que guardó www.google.com a través de su navegador o curl. Agregue la gema Fakeweb a su prueba.archivo rb

A continuación, el código es

stream = File.read("saved_google_page.html") 
FakeWeb.register_uri(:get, 
    "http://www.google.com", 
    :body => stream, 
    :content_type => "text/html") 

Al hacer su llamada Mechanize nivel de

agent = Mechanize.New 
page = agent.get("http://www.google.com/") 

Fakeweb devolverá la página que guarda con las cabeceras content_type establecidos de una manera que Mechanize se Creo que accedió a Internet con éxito. Asegúrese de que el encabezado content_type esté configurado, ya que, de lo contrario, Mechanize trata la respuesta como Mechanize :: File en lugar de Mechanize :: Page. Puede probar que está funcionando completamente ejecutando pruebas en su máquina con la conexión de red desenchufada.

p.s. Estoy respondiendo esto 6 meses después de que se hizo la pregunta, ya que este es el resultado principal en Google, pero no ha recibido respuesta. Acabo de pasar 30 minutos pensando en esto y pensé en compartir la solución.

+0

Gracias, esto funcionó para mí. Aquí hay una solución que muestra el ejemplo de trabajo: http://github.com/JoshCheek/Play/tree/master/mocking-the-internet/ –

1

Si está escribiendo pruebas funcionales y el servidor no tiene que ser algo de fantasía, se puede escribir un pequeño servidor HTTP que se ejecuta sólo para la prueba; el código de prueba configura el código bajo prueba para contactar al pequeño servidor HTTP en localhost :.

Recomiendo WEBrick. Poner un servidor HTTP es muy fácil.

2

Si está escribiendo pruebas unitarias, entonces está buscando el extremo equivocado del stick, no necesita burlarse de google.com, pero debe burlarse/resguardar el objeto Mechanize, es decir. se crea un objeto mecanizado, se llama al método get en el objeto con el parámetro http://www.google.com. Y sí, necesitas probar la operación que estás realizando en el resultado que obtienes visitando la página que puedes hacer fácilmente mediante una respuesta restringida y luego haciendo toda la prueba. Por ejemplo, si está utilizando moca, a continuación,

mechanize = stub('WWW::Mechanize') 
WWW::Mechanize.stubs(:new).returns(mechanize) 
mechanize.stubs(:get).with('http://www.google.com').returns('What ever out put you are expecting so that you can test') 

No creo que realmente necesita para comprobar si la solicitud va a google.com o no, ya que ya ha sido probado en Mechanize joya.

En otra nota, si está realizando pruebas de integración/pepino, puede usar sinatra para falsificar el sitio. Sinatra hace que sea muy fácil escribir un script de una sola página y ejecutar ese script como un sitio web.

Editar:

Si no está utilizando moca, entonces tienes que instalarlo y requieren en sus pruebas

sudo gem install mocha 

Y en sus pruebas

require 'rubygems' 
require 'mocha' 
+3

Honestamente, creo que esto es una cuestión de opinión. Stubbing Mechanize sería un proceso doloroso en comparación con algo como FakeWeb dada la complejidad de los objetos resultantes. Lo más probable es que termines con pruebas de mantenimiento muy frágiles/de alto nivel que están estrechamente relacionadas con la implementación exacta al apagarse. Aunque generalmente estoy de acuerdo en que no debes probar dependencias externas, creo que esta es una excepción a esa regla. –

Cuestiones relacionadas