Rspec-core: O contexto compartilhado não funciona com métodos estendidos

Criado em 16 dez. 2019  ·  5Comentários  ·  Fonte: rspec/rspec-core

Assunto do problema

Métodos que foram injetados por meio de config.extend(...) não são definidos quando chamados em contextos compartilhados.

Seu ambiente

  • Versão Ruby: 2.6
  • versão rspec-core: 3.9.0

Passos para reproduzir

module Foo
  def something
    puts 'hi'
  end
end

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

RSpec.shared_context 'shared' do
  something
end

Comportamento esperado

Imprime 'oi'

Comportamento real

something é indefinido

Bug

Todos 5 comentários

Você pode fornecer um pouco mais de contexto de como usar esse contexto compartilhado? Não consigo reproduzir este comportamento:

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

saídas:

$ 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

Vou encerrar isso por enquanto e investigar o que há de errado no meu lado. Obrigado pela resposta. Apresentarei um relatório quando eu descobrir.

Acho que o problema acontece quando inclui contexto dentro do bloco de configuração:

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

saídas:

$ 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 Reabri o problema desde que @tubaxenor forneceu o exemplo de falha.

Obrigado pelo exemplo de reprodução.
Suspeito que seja a ordem de inclusão. Pontos de depuração rápida em lib/rspec/core/configuration.rb:1513 .

Faz sentido estender primeiro e incluir depois. Você pode pensar em um bom exemplo em que um módulo precisaria de algo definido no contexto compartilhado?

Você pode tentar trocar as linhas 1513 e 1514 e ver se algumas especificações / recursos falham.

Você quer lidar com o problema com cuidado?

Esta página foi útil?
0 / 5 - 0 avaliações