2012-07-01 18 views
13

仕様間でメモのついたメソッドを共有したい。だから私はこのような共有コンテキストを使用しようとしましたRSpecで自動的にコンテキストを共有する

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

describe 'something' do 
    include_context :specs 
end 

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

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

letRSpec.configureではサポートされていませんが、あなたを設定することができます:あなたはconfigure-class-methodsConfiguration経由RSpec.configureを使用してグローバルbeforeフックを設定することができ、この

RSpec.configure do |spec| 
    spec.include_context :specs 
end 
+0

これはおそらくhttp://stackoverflow.com/questions/9965111/rspec-shared-context-and-include-context-for-all-specsを複製し、それはまだ答えを持っていません。 – p0deje

答えて

28

よう

何かグローバルletSharedContext moduleに含めてconfig.beforeを使用してそのモジュールは:モジュールを含むためのメカニズムがあります、およびモジュールを含めるには、独自のコールバック機構を持っています

module MyLetDeclarations 
    extend RSpec::Core::SharedContext 
    let(:foo) { Foo.new } 
end 
RSpec.configure { |c| c.include MyLetDeclarations } 
+12

FYI RSpec 3を使っている人は、 'RSpec :: Core :: SharedContext'がなくなり、' RSpec :: SharedContext'に置き換えられたようです。 – womble

+0

これは素晴らしい解決策です。私がRSpec 3で見つけた小さな問題は、(例のグループブロックではなく)サンプルブロックにそのタグを含めてタグを渡すとエラー 'NoMethodError:super:no superclass method \' foo ' #これは意味ですか? #foo'。修正は、タグが例ではなくサンプルグループにあることを確認することです。 –

+1

@GabeKopleyと同じエラーが発生しましたが、RSpec 3.4.0へのアップグレードが問題を解決したことがわかりました。 – phylae

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-core 2.13.0と2.13.0 rspec-railsで動作

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

0

また、あなたはスペック内のbeforeブロックで共有データを使用する機能が必要な場合は、私のように、(そのRailsのプロジェクト場合)、これを含めるようにしてみてください。

module SettingsHelper 
    extend ActiveSupport::Concern 

    included do 
    attr_reader :default_headers 

    before :all do 
     @default_headers = Hash[ 
      'HTTP_HOST' => 'test.lvh.me' 
     ] 
    end 

    after :all do 
     @default_headers = nil 
    end 
    end 
end 

RSpec.configure do |config| 
    config.include SettingsHelper 
end 

または類似のものを試してみてください、@threedaymonkの答えを見て。

1

もう1つの方法は、automatically share examples via metadataです。だから、私はそれを使用する

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のレール、です。あなたはconfig.infer_spec_type_from_file_location!を持っているのであれば、あなたは簡単に行うことができます:RSpecの3+で

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

describe SomeController do 
    # I have access to 'foo' variable 
end 
5

を、次のようにこれを達成することができます - ジェレミー・ピーターソンの答えに基づきます。

# spec/supprt/users.rb 
module SpecUsers 
    extend RSpec::SharedContext 

    let(:admin_user) do 
    create(:user, email: '[email protected]') 
    end 
end 

RSpec.configure do |config| 
    config.include SpecUsers 
end 
関連する問題