Los métodos que se inyectaron a través de config.extend(...)
no se definen cuando se llaman dentro de contextos compartidos.
module Foo
def something
puts 'hi'
end
end
RSpec.configure do |config|
config.extend(Foo)
end
RSpec.shared_context 'shared' do
something
end
Imprime 'hola'
something
no está definido
¿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?