Rspec-core: 共有コンテキストは拡張メソッドでは機能しません

作成日 2019年12月16日  ·  5コメント  ·  ソース: rspec/rspec-core

問題の主題

config.extend(...)を介して注入されたメソッドは、共有コンテキスト内で呼び出された場合は定義されません。

あなたの環境

  • Rubyバージョン:2.6
  • rspec-coreバージョン:3.9.0

再現する手順

module Foo
  def something
    puts 'hi'
  end
end

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

RSpec.shared_context 'shared' do
  something
end

予想される行動

'hi'を出力します

実際の動作

somethingは未定義です

Bug

全てのコメント5件

その共有コンテキストをどのように使用するかについて、もう少しコンテキストを提供していただけますか? この動作を再現できません:

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

出力:

$ 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

とりあえずこれを閉じて、私の側で何が悪いのかを調査します。 返信ありがとうございます。 私がそれを理解したときに報告します。

configureブロック内にコンテキストを含めると問題が発生すると思います。

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

出力:

$ 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

@tubaxenorが失敗例を提供するので@pirj私はこの問題をリニューアルオープンしました。

複製例をありがとう。
包含順序だと思います。 クイックデバッグはlib/rspec/core/configuration.rb:1513指します。

最初に拡張し、後に含めるのは理にかなっています。 モジュールが共有コンテキストで定義されたものを必要とする場合の良い例を思いつくことができますか?

1513行目と1514行目を入れ替えて、一部の仕様/機能が失敗するかどうかを確認できます。

問題に注意深く取り組みたいですか?

このページは役に立ちましたか?
0 / 5 - 0 評価