2011-03-08 14 views
7

Estoy trabajando en la escritura de pruebas de unidades simples para un proyecto de Rails 3, pero no puedo ejecutar ninguna prueba.Dado un entorno típico de Rails 3, ¿por qué no puedo ejecutar ninguna prueba?

El caso en cuestión, el intento de ejecutar la prueba de auto-generado por los carriles falla:

require 'test_helper' 

class UserTest < ActiveSupport::TestCase 
    # Replace this with your real tests. 
    test "the truth" do 
    assert true 
    end 
end 

Resultados en el siguiente error:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- 
test_helper (LoadError) 
     from <internal:lib/rubygems/custom_require>:29:in `require' 
     from user_test.rb:1:in `<main>' 

comentando la línea require 'test_helper' y que intentan para ejecutar los resultados de la prueba en este error:

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError) 

Las gemas del paquete de acción aparecen t o estar debidamente instalado y hasta la fecha:

actionmailer (3.0.3, 2.3.5) 
actionpack (3.0.3, 2.3.5) 
activemodel (3.0.3) 
activerecord (3.0.3, 2.3.5) 
activeresource (3.0.3, 2.3.5) 
activesupport (3.0.3, 2.3.5) 

Ruby es en 1.9.2p0 y rieles está en 3.0.3.

El vertedero muestra de mi directorio de prueba es el siguiente:

/fixtures 
/functional 
/integration 
/performance 
/unit 
-- /helpers 
    -- user_helper_test.rb 
-- user_test.rb 
test_helper.rb 

nunca he visto este problema antes - Me he encontrado las tareas típicas del rastrillo para preparar el entorno de prueba. No tengo nada fuera de lo común en los archivos de configuración de mi aplicación o entorno, ni he instalado gemas inusuales que puedan interferir con el entorno de prueba.

edición de marzo de nono

Xavier Holt 's sugerencia, especificar explícitamente la ruta a la test_helper trabajado; sin embargo, esto reveló un problema con ActiveSupport.

Ahora cuando intento ejecutar la prueba, aparece el siguiente mensaje de error (como también se enumeran más arriba):

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError) 

Pero como se puede ver arriba, Action Pack es todo instalado y la actualización hasta la fecha.

edición de marzo de 13ª

Al intentar ejecutar pruebas utilizando rake test:units este seguimiento de pila se descarga en la consola:

test/unit/bookmark_test.rb:3:in `<top (required)>': uninitialized constant Objec 
t::ActiveSupport (NameError) 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `block in <main>' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each' 
     from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `<main>' 
rake aborted! 

Así que buscando en el archivo mencionado anteriormente, veo lo siguiente:

#!/usr/bin/env ruby 

# Load the test files from the command line. 

ARGV.each { |f| load f unless f =~ /^-/ } 

Que yo sepa, todo se ve como se esperaba.

+0

¿Podría enumerar los contenidos de su directorio 'test'? No es necesario enumerar * cada * prueba unitaria, etc., solo la descripción general (específicamente donde 'test_helper.rb' es). –

+1

El mentor de My Rails me hizo cambiar todas las líneas 'require 'test_helper'' en mis pruebas para' requerir File.dirname (__ FILE__) +' /../ test_helper''. Si bien esto era para resolver un problema diferente (y sí, es feo como el infierno), sospecho que podría funcionar para usted. –

+0

Eso funcionó, pero terminó revelando otro problema con ActiveSupport. Actualizando la pregunta. – Tom

Respuesta

10

Su archivo test/test_helper debería haberse creado al generar la aplicación. Contiene este valioso contenido:

ENV["RAILS_ENV"] = "test" 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. 
    # 
    # Note: You'll currently still have to declare fixtures explicitly in integration tests 
    # -- they do not yet inherit this setting 
    fixtures :all 

    # Add more helper methods to be used by all tests here... 
end 

La segunda línea aquí es la más importante: se requiere el archivo config/environment.rb en la raíz de su aplicación, que a su vez requiere una gran cantidad de otras cosas, incluyendo el valioso (me gusta esa palabra hoy, ¿de acuerdo?) ActiveSupport constante.

Cuando genera un controlador, modelo o andamio, también genera pruebas para esos. Acabo de funcionar rails g scaffold ticket en mi aplicación y generó test/unit/ticket_test.rb que contiene lo siguiente:

require 'test_helper' 

class TicketTest < ActiveSupport::TestCase 
    # Replace this with your real tests. 
    test "the truth" do 
    assert true 
    end 
end 

La primera línea de este archivo requerirá el archivo test/test_helper.rb que sobresalen de la sierra. Esto cargará ActiveSupport y la clase TestCase dentro de él, lo que hace que esta prueba sea factible. Todo lo demás fluye desde allí.

Con toda esa explicación fuera del camino (aunque es algo que ya sabes), estoy haciendo una gran apuesta en que es algo que cargue masivamente tu LOAD_PATH, haciendo que el directorio test se elimine de él.

Lo que es realmente inusual es que cuando especifica la ruta completa al test/test_helper.rb, está diciendo que lo carga, pero ActiveSupport aún no está definido. Bueno, eso debería cargarse como lo hace la descripción anterior. ¿De hecho está cargando config/environment.rb? Se puede poner algo como:

puts "LOADING CONFIG/ENVIRONMENT.RB" 

En la parte superior de su archivo config/environment.rb y luego ejecutar las pruebas de nuevo? Debería ser salida. Muy inusual.

Continuando con el hilo sobre LOAD_PATH ... ¿Tiene un pequeño secreto sucio del que no nos está hablando?

En realidad, Dan Cheail hace un buen punto. Podría ejecutar las pruebas usando ruby test/unit/ticket_test.rb, en cuyo caso test_helper no estaría disponible, pero aún así no explica por qué cuando especifica la ruta completa, todavía obtiene una constante indefinida ActiveSupport.

Si desea ejecutar una sola prueba que debería estar haciendo esto:

ruby -Itest test/unit/ticket_test.rb 

Eso -I opción no añade el directorio test a la trayectoria de la carga, es decir, el archivo test_helper estará disponible a través de una recta require 'test_helper'. Si sigue teniendo errores después de esto, creo que su test/test_helper.rb está vacío o roto.

+0

Gracias por la respuesta detallada. Todo lo que ha descrito aquí está en su lugar con la excepción de especificar la impresión en la parte superior de environment.rb - en realidad no se imprime. Yo * estoy * ejecutando pruebas usando '> ruby ​​test/unit/user_test.rb' ya que así es como siempre he estado ejecutando pruebas (desde las primeras versiones de Rails). ¿Rake es la forma preferida incluso para archivos individuales? – Tom

+0

Tom: sí, debería usar 'rake' para ejecutarlos. Si desea ejecutar uno solo, le recomendaría ejecutar este comando 'ruby -Itest test/unit/ticket_test.rb'. Actualizaré la respuesta con una explicación. –

+0

Actualicé mi comentario en @ Dan's answer. Cuando intento ejecutar Ruby -Itest, aún recibo la excepción de constante no inicializada para ActiveSupport. – Tom

0

Disculpa la publicación aquí, pero todavía no puedo comentar las preguntas.

qué entorno estás ejecutando, Win (tiene un problema con un archivo .gemspec) Linux, Mac?

¿Estás utilizando RVM?

Test-Unit se instala de forma predeterminada con Rails, si instaló la unidad de prueba gem obtendrá un conflicto entre los 2. intente desinstalar la gema y sus pruebas deberían comenzar a funcionar.

Si se ejecuta en Windows Me joya de desinstalación "autotest", a continuación, vaya a la siguiente dir

drive:\Ruby192\lib\ruby\gems\1.9.1\specifications 

Aquí encontrará archivos .gemspec. Asegúrese de que no tiene 2 archivos autotest.gemspec ni ninguno, para el caso. si es así eliminarlos (eliminarlos), luego descargar e instalar gem la gema de autotest nuevamente. Obtenga lo último utilizando el cambio de versión.

Debería poder ejecutar sus autocomposiciones. Me encontré con esto una vez antes, así que para solucionarlo, simplemente eliminé los archivos de vista y de prueba auxiliar y escribí todo en el archivo de prueba estándar. Aparte de eso, sé que correr en el autotest de Windows tenía problemas, debido a que el instalador de ruby ​​y el bundler no borraban las cosas correctamente y olvidaban los archivos.

Voy a encontrar el enlace para usted, para una mejor explicación.

+0

Correr en Windows y todas las gemas son típicas con una instalación de Rails 3. No se han agregado herramientas de prueba adicionales. – Tom

+0

@Tom ha actualizado la respuesta para usted, con respecto a un directorio para mirar. – IanN

+0

No se encontraron archivos autotest.gemspec en/especificaciones. El único archivo similar a eso es .old.rake.gemspec. – Tom

0

El problema que está teniendo es la forma en que está ejecutando las pruebas. Simplemente llamando al ruby test/unit/user_test.rb no configura la ruta de carga, lo que explica los problemas que ha tenido.

rake test:units es lo que desea y debería funcionar de inmediato.

+0

Desafortunadamente, la prueba de rake: unidades sigue dando como resultado un rastro de pila. La primera línea contiene: test/unit/user_test.rb: 3: in ' ': constante no inicializada Object :: ActiveSupport (NameError) – Tom

Cuestiones relacionadas