16

仕様間でメモ化されたメソッドを共有したい。だから私はこのような共有コンテキストを使用しようとしました

RSpec.configure do |spec|
  spec.shared_context :specs do
    let(:response) { request.execute! }
  end
end

describe 'something' do
  include_context :specs
end

それは正常に動作します。しかし、私は約 60 個の仕様ファイルを持っているので、それぞれにコンテキストを明示的に含める必要があります。のすべてのサンプル グループに共有コンテキスト (または少なくともlet定義)を自動的に含める方法はありspec_helper.rbますか?

このようなもの

RSpec.configure do |spec|
  spec.include_context :specs
end
4

5 に答える 5

31

configure-class-methodsおよびConfigurationを使用して、グローバルbeforeフックを設定できます。RSpec.configure

RSpec.configure {|c| c.before(:all) { do_stuff }}

letは ではサポートされてRSpec.configureいませんが、それをSharedContext モジュールに含め、次を使用してそのモジュールを含めることにより、グローバルを設定できます。letconfig.before

module MyLetDeclarations
  extend RSpec::Core::SharedContext
  let(:foo) { Foo.new }
end
RSpec.configure { |c| c.include MyLetDeclarations }
于 2012-07-01T18:30:19.403 に答える
5

モジュールをインクルードするためのメカニズムがあり、モジュールのインクルードには独自のコールバック メカニズムがあります。

たとえばdisconnected、データベース接続なしですべてのモデル仕様を実行するために使用したい共有コンテキストがあるとします。

shared_context "disconnected"  do
  before :all do
    ActiveRecord::Base.establish_connection(adapter: :nulldb)
  end

  after :all do
    ActiveRecord::Base.establish_connection(:test)
  end
end

インクルード時にそのコンテキストを含めるモジュールを作成できるようになりました。

module Disconnected
  def self.included(scope)
    scope.include_context "disconnected"
  end
end

最後に、そのモジュールを通常の方法ですべての仕様に含めることができます (私はモデルに対してのみ実行することを示しましたが、それができることを示すためです)。これは、あなたが求めていたものとほとんど同じです。

RSpec.configure do |config|
  config.include Disconnected, type: :model
end

これはrspec-core2.13.0 およびrspec-rails2.13.0 で動作します。

于 2013-03-07T11:36:26.293 に答える
2

もう 1 つの方法は、メタデータを介して例を自動的に共有することです。そう:

shared_context 'a shared context', a: :b do
  let(:foo) { 'bar' }
end

describe 'an example group', a: :b do
  # I have access to 'foo' variable
end

私がこれを使用する最も一般的な方法は rspec-rails であり、例のグループ タイプに応じていくつかの共有コンテキストがあります。したがって、 がある場合はconfig.infer_spec_type_from_file_location!、次のように簡単に実行できます。

shared_context 'a shared context', type: :controller do
  let(:foo) { 'bar' }
end

describe SomeController do
  # I have access to 'foo' variable
end
于 2015-06-02T06:54:56.380 に答える