¿Cómo ejecutar una sola prueba desde un conjunto de pruebas de rails?

Respuestas:

158

NOTA: Esto no ejecuta la prueba a través de rake. Entonces, cualquier código que tenga RakefileNO se ejecutará.

Para ejecutar una sola prueba, use el siguiente comando del directorio principal de su proyecto rails:

ruby -I test test/unit/my_model_test.rb -n test_name

Esto ejecuta una única prueba llamada "nombre", definida en la clase MyModelTest en el archivo especificado. Test_name se forma tomando el nombre de la prueba, precediéndola con la palabra "test" y separando las palabras con guiones bajos. Por ejemplo:

class MyModelTest < ActiveSupport::TestCase

  test "valid with good attributes" do
    # do whatever you do
  end

  test "invalid with bad attributes" do
    # do whatever you do
  end
end

Puede ejecutar ambas pruebas a través de:

ruby -I test test/unit/my_model_test.rb

y solo la segunda prueba a través de

ruby -I test test/unit/my_model_test.rb -n test_invalid_with_bad_attributes
Darryl
fuente
44
Esto no funciona para mí (en pruebas funcionales o unitarias). Consigo 0 tests, 0 assertions, 0 failures, 0 errors. Rieles 3.0.7.
B Seven
10
Personalmente, soy un fan de la forma de expresiones regulares: -n "/good/". El escape de Shell siempre es divertido, por lo que tiendo a mantener expresiones regulares simples, pero es mucho más fácil que escribir el nombre completo de la prueba todo el tiempo.
Groxx
44
Es importante tener en cuenta que para que esto funcione, no debe estar en el directorio PRINCIPAL como se especifica en la respuesta, sino en el subdirectorio que contiene la test/carpeta. Por ejemplo, si quiero ejecutar la prueba activesupport/test/core_ext/array_ext_test.rb, debería estar activesupport/primero.
Vincent B.
3
@Groxx - ¡Finalmente una solución! ¡Gracias! -n "/good/"trabajó.
B Seven
Tenga cuidado al ejecutar esto en 2018+. Omite algunas tareas de prueba integradas en rails (como db: test: prepare) que se usan para muchas cosas, como intercambiar datos locales por datos de accesorios y restaurarlos nuevamente. Ejecutar esto voló mi base de datos local. Considere una solución que utiliza las tareas de prueba de rieles incorporadas, como stackoverflow.com/a/47006811/1154642 (que funcionó para mí).
bryanbraun
100

Ejecute un archivo de prueba :

rake test TEST=tests/functional/accounts_test.rb

Ejecute una sola prueba en un archivo de prueba:

rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n /paid accounts/"

(Del comentario de @Puhlze.)

laffuste
fuente
10
Además, si desea ejecutar una sola prueba en el archivo dado, puede agregar una variable de entorno TESTOPTS que se pasará a la prueba. EG rake test TEST = tests / funcional / accounts_test.rb TESTOPTS = "- n / cuentas pagas /"
Puhlze
1
si el último comando de prueba no funciona, intente rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"(encerrándolo /paid accounts/con comillas simples)
rrw
38

Para rieles 5:

rails test test/models/my_model.rb
James
fuente
9
Pero esto va en todos los casos de prueba en el archivo, la pregunta se refiere a ejecutar una sola prueba ...
user000001
Puede ejecutar una sola prueba agregando un número de línea a un nombre de archivo:bin/rails test test/models/user_test.rb:27
Segfault
30

Gracias a @James, la respuesta parece ser:

rails test test/models/my_model.rb:22

Suponiendo que 22 es el número de línea de la prueba dada. Según la ayuda de rails:

 $ rails test --help

Puede ejecutar una sola prueba agregando un número de línea a un nombre de archivo:

    bin/rails test test/models/user_test.rb:27

Además, tenga en cuenta que su prueba debe heredar de ActionDispatch :: IntegrationTest para que esto funcione (Ese fue mi error):

class NexApiTest < ActionDispatch::IntegrationTest
.
.
.
Roozbeh Zabihollahi
fuente
44
Esta parece ser la mejor respuesta basada en las guías de Rails, al menos para probar una línea específica.
tfantina
12

En los carriles 5,

Utilicé esta manera para ejecutar un solo archivo de prueba (todas las pruebas en un archivo)

rails test -n /TopicsControllerTest/ -v

mira aquí https://stackoverflow.com/a/41183694/3626659

Alupotha
fuente
1
Esta es la mejor respuesta a la pregunta para las versiones recientes de rails, +1
user000001
5

Para ejecutar una sola prueba en la suite Rails real:

bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb
Brian Rose
fuente
3

Esa fue una tonta pregunta de medianoche mía. Rails imprime amablemente el comando que está ejecutando rake test. El resto es un ejercicio de cortar y pegar.

~/projects/rails/actionpack (my2.3.4)$ ruby -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/controller/base_test.rb"
artemave
fuente
2

Si desea ejecutar una sola prueba, puede ejecutarlas como un script Ruby normal

ruby actionmailer/test/mail_layout_test.rb

También puede ejecutar un conjunto completo (por ejemplo, ActiveRecord o ActionMailer) entrando cden el directorio y ejecutándose rake testallí.

Aupajo
fuente
1
No en Rails: al menos no con los archivos de prueba predeterminados generados. Tienen "require 'test_helper'" en la primera línea, pero la ruta de carga no se habrá configurado a tiempo. Si cambia cada primera línea a un requerimiento explícito ("require File.join (File.dirname ( FILE ), '..', 'test_helper')"), entonces su solución funciona.
James A. Rosen el
ejem, eso esrequire File.join(File.dirname(__FILE__), '..', 'test_helper')
James A. Rosen
@Gaius Revisado dos veces. El primero no funciona, pero cdsí funciona. Para ser claros (no estoy seguro si estoy leyendo mal esto, pero dijiste "archivos de prueba generados"), esto es para la biblioteca Rails en sí, no para un proyecto Rails.
Aupajo
2

En mi situación rakesolo funciona TESTOPTS="-n='/sample/'":

bundle exec rake test TEST=test/system/example_test.rb TESTOPTS="-n='/sample/'"
N0xFF
fuente
0

Primero, acceda a la carpeta de la biblioteca que desea probar (esto es importante) y luego ejecute:

~/Projects/rails/actionview (master)$ ruby -I test test/template/number_helper_test.rb 
Diego Plentz
fuente
0

Carpeta Rails

  bundle install
  bundle exec ruby -I"activerecord/test" activerecord/test/cases/relation/where_test.rb 

Tenga en cuenta que necesita cargar la carpeta apropiada: "activerecord / test" (donde tiene prueba)

Igor Kasyanchuk
fuente