RSpec 3.5 から shared_context のメタデータの使い方に変更があったのでメモ。

このようなテストがあったとします。

context 'given login' do
  let(:user) { create(:user) }
  before { signin_as user }
  ...
end

shared_context を使うと、このように書くことが出来ます。同じ context を複数で使いたい場合に便利です。

shared_context 'User signin' do
  let(:user) { create(:user) }
  before { signin_as user }
end

context 'given login' do
  include_context 'User signin'
  ...
end

RSpec 3.4 までは、メタデータを使ってこのように省略することが出来ました。

shared_context 'User signin', :signin do
  let(:user) { create(:user) }
  before { signin_as user }
end

context 'given login', :signin do
  ...
end

でも、RSpec 3.5 から上の書き方では Include されません。このように書く必要があります。

shared_context 'User signin' do
  let(:user) { create(:user) }
  before { signin_as user }
end

context 'given login', :signin do
  ...
end

RSpec.configure do |config|
  config.include_context 'User signin', :signin
end

RSpec 3.5 から、セットアップ時に以下の設定が追加されたためです。

RSpec.configure do |config|
  config.shared_context_metadata_behavior = :apply_to_host_groups
end

RSpec 3.4 以前から使っていれば、この設定は存在しないので、設定値はデフォルトの :trigger_inclusion になります。RSpec 4 でこの挙動は廃止されるそうです。

参考: