Rspec-core: El contexto compartido no funciona con métodos extendidos

Creado en 16 dic. 2019  ·  5Comentarios  ·  Fuente: rspec/rspec-core

Asunto del problema

Los métodos que se inyectaron a través de config.extend(...) no se definen cuando se llaman dentro de contextos compartidos.

Tu entorno

  • Versión Ruby: 2.6
  • rspec-core versión: 3.9.0

pasos para reproducir

module Foo
  def something
    puts 'hi'
  end
end

RSpec.configure do |config|
  config.extend(Foo)
end

RSpec.shared_context 'shared' do
  something
end

Comportamiento esperado

Imprime 'hola'

Comportamiento real

something no está definido

Bug

Todos 5 comentarios

¿Puede proporcionar un poco más de contexto de cómo usa ese contexto compartido? No puedo reproducir este comportamiento:

module Foo
  def something
    puts 'hi'
  end
end

RSpec.configure do |config|
  config.extend Foo
end

RSpec.shared_context 'shared' do
  something
end

RSpec.describe do
  include_context 'shared'

  it { }
end

salidas:

$ rspec spec/a_spec.rb
hi
Run options: exclude {:ruby=>#<Proc:./spec/spec_helper.rb:99>}

Randomized with seed 10987


  example at ./spec/a_spec.rb:18

Finished in 0.00185 seconds (files took 1.19 seconds to load)
1 example, 0 failures

Randomized with seed 10987

Cerraré esto por ahora e investigaré lo que está mal en mi parte entonces. Gracias por la respuesta. Informaré cuando lo averigüe.

Creo que el problema ocurre cuando se incluye contexto dentro del bloque de configuración:

module Foo
  def something
    puts 'hi'
  end
end

RSpec.configure do |config|
  config.extend Foo
end

RSpec.shared_context 'shared' do
  something
end

RSpec.configure do |config|
  config.include_context 'shared', foo: :enabled
end

RSpec.describe "Foo", foo: :enabled do
  it { }
end

salidas:

$ rspec spec/foo_spec.rb
An error occurred while loading ./spec/foo_spec.rb.
Failure/Error: something

NameError:
  undefined local variable or method `something' for RSpec::ExampleGroups::Foo:Class

No examples found.

Finished in 0.00017 seconds (files took 1.35 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

@pirj He reabierto el problema desde que @tubaxenor proporcionó el ejemplo fallido.

Gracias por el ejemplo de reproducción.
Sospecho que es la orden de inclusión. Puntos de depuración rápida en lib/rspec/core/configuration.rb:1513 .

Tiene sentido extender primero e incluir después. ¿Puede pensar en un buen ejemplo en el que un módulo necesitaría algo definido en el contexto compartido?

Puede intentar intercambiar las líneas 1513 y 1514 y ver si fallan algunas especificaciones / características.

¿Quiere abordar el problema con cuidado?

¿Fue útil esta página
0 / 5 - 0 calificaciones