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 でこの挙動は廃止されるそうです。
参考: