Les méthodes qui ont été injectées via config.extend(...)
ne sont pas définies lorsqu'elles sont appelées dans des contextes partagés.
module Foo
def something
puts 'hi'
end
end
RSpec.configure do |config|
config.extend(Foo)
end
RSpec.shared_context 'shared' do
something
end
Imprime «salut»
something
n'est pas défini
Pouvez-vous s'il vous plaît fournir un peu plus de contexte sur la façon dont vous utilisez ce contexte partagé? Je ne parviens pas à reproduire ce comportement:
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
les sorties:
$ 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
Je vais clore ça pour l'instant et enquêter sur ce qui ne va pas de mon côté alors. Merci pour la réponse. Je ferai rapport quand je le découvrirai.
Je pense que le problème se produit lorsque vous incluez le contexte dans le bloc de configuration:
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
les sorties:
$ 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 J'ai rouvert le problème depuis que @tubaxenor a fourni l'exemple défaillant.
Merci pour l'exemple de reproduction.
Je soupçonne que c'est l'ordonnance d'inclusion. Points de débogage rapide à lib/rspec/core/configuration.rb:1513
.
Il est logique d'étendre d'abord et d'inclure ensuite. Pouvez-vous penser à un bon exemple où un module aurait besoin de quelque chose qui est défini dans le contexte partagé?
Vous pouvez essayer d'échanger les lignes 1513 et 1514 et voir si certaines spécifications / fonctionnalités échouent.
Voulez-vous aborder le problème avec soin?