¿Deshabilitar un grupo de pruebas en rspec?

103

Tengo una especificación de prueba que es describesuna clase y dentro de ella tiene varios, contextscada uno con varios itbloques.

¿Hay alguna forma de desactivar contexttemporalmente?

Intenté agregar una pending "temporarily disabled"llamada en la parte superior dentro de un contextque quiero deshabilitar, y vi algo sobre pendiente cuando ejecuté la especificación, pero luego continuó ejecutando el resto de las pruebas.

Esto es lo que tuve:

describe Something
  context "some tests" do
    it "should blah" do
      true
    end
  end

  context "some other tests" do
    pending "temporarily disabled"

    it "should do something destructive" do
      blah
    end
  end
end

pero como dije, simplemente pasó a ejecutar las pruebas debajo de la llamada pendiente.

La búsqueda me llevó a este hilo de la lista de correo en el que el creador (?) De rspec dice que es posible en rspec 2, que estoy ejecutando. Supongo que funcionó, pero no tuvo el efecto deseado de deshabilitar todas las siguientes pruebas, que es lo que pienso cuando veo una pendingllamada.

¿Existe una alternativa o lo estoy haciendo mal?

Jorge Israel Peña
fuente

Respuestas:

166

Para deshabilitar un árbol de especificaciones usando RSpec 3 , puede:

before { skip }
# or 
xdescribe
# or 
xcontext

Puede agregar un mensaje con omisión que aparecerá en la salida:

before { skip("Awaiting a fix in the gem") }

con RSpec 2 :

before { pending }
Pyro
fuente
1
¿Cómo se hace exactamente eso en un bloque que cuenta con:describe 'XXXXX' do .... end
p.matsinopoulos
2
@ p.matsinopoulos Solo agréguelo a la línea siguiente describe 'XXXXX' do. Funcionó como un encanto, gracias @Pyro!
chesterbr
Solución más simple que los filtros, +1
dolzenko
te quiero. ¡Te debo una cerveza!
Aldo 'xoen' Giambelluca
2
Esto es bonito. También puede incluir un mensaje después de 'omitir' que aparecerá en la salida.
Jan Hettich
44

Utilice filtros de exclusión . Desde esa página: En su spec_helper.rb(o rails_helper.rb)

RSpec.configure do |c|
  c.filter_run_excluding :broken => true
end

En tu prueba:

describe "group 1", :broken => true do
  it "group 1 example 1" do
  end

  it "group 1 example 2" do
  end
end

describe "group 2" do
  it "group 2 example 1" do
  end
end

Cuando ejecuto "rspec ./spec/sample_spec.rb --format doc"

Entonces la salida debe contener "grupo 2 ejemplo 1"

Y la salida no debe contener "grupo 1 ejemplo 1"

Y la salida no debe contener "grupo 1 ejemplo 2"

Robert Speicher
fuente
19

Mira lo que piensas de esto:

describe "something sweet", pending: "Refactor the wazjub for easier frobbing" do
  it "does something well"
  it "rejects invalid input"
end

Me gusta ver los motivos de mis elementos pendientes cuando desactivo algo durante "un tiempo". Sirven como pequeños comentarios / tareas pendientes que se presentan con regularidad en lugar de enterrarse en un comentario o un ejemplo / archivo excluido.

Cambiar ita pendingo xites rápido y fácil, pero prefiero la construcción hash. Le brinda la documentación de cada ejecución, es un complemento (no cambia describe / context / it, así que tengo que decidir qué usar nuevamente más adelante), y se elimina con la misma facilidad si se toma la decisión o se elimina el bloqueador .

Esto funciona igual para grupos y ejemplos individuales.

botimer
fuente
Además, no estoy seguro de si funciona igual para la descripción, pero en la última instancia, en realidad, ejecuta la prueba y falla si la prueba comienza a pasar. El xdescribe (supongo que al igual que xit), simplemente no lo ejecuta.
PL J
1
confirmó que esto funciona, con ambos pending:y skip:, en rspec 3.6.0. Me parece la mejor solución. en rspec3 pendiente todavía ejecuta pruebas, pero skipno (sin embargo, aplica skip).
jrochkind
9

otro. https://gist.github.com/1300152

use xdescribe, xcontext, xit para deshabilitarlo.

Actualizar:

Desde rspec 2.11, incluye xit por defecto. entonces el nuevo código será

# put into spec_helper.rb
module RSpec
  module Core
    module DSL
      def xdescribe(*args, &blk)
        describe *args do
          pending 
        end
      end

      alias xcontext xdescribe
    end
  end
end

Uso

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 
GutenYe
fuente
3

Utilice pendiente en lugar de describir. Si tu bloque es:

context "some other tests" do
  it "should do something destructive" do
    blah
  end
end

Puede omitir todo el bloque de la siguiente manera:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end
Amir Samakar
fuente
1
describe "GET /blah" do

  before(:each) { pending "Feature to be implemented..." }

  it { expect(page).to have_button("Submit") }
  it { expect(page).to have_content("Blah") }
end
Mate
fuente
0

Solo para explicar lo que está sucediendo con su código. Incluyéndolo donde lo tiene, simplemente se evalúa (y por lo tanto se ejecuta) cuando el archivo se carga durante el inicio. Sin embargo, es necesario que se ejecute cuando se ejecuten las pruebas. Es por eso que las respuestas han sugerido poner pending(RSpec 2) o skip(RSpec 3) en un beforebloque.

PhilT
fuente