15 min/d

ぼうずやのにっき

RSpec の shared_context をメタデータで指定する

RSpec では似たような context を共有するために shared_context というものがある。 include_context を呼び出すことで使えるのだけど、ほかにも方法があることを知った。それがメタデータとして指定する方法だ。

RSpec 3.5 から現在の記法になっているらしい。

http://rspec.info/ja/blog/2016/07/rspec-3-5-has-been-released/

分かりやすくないけど、公式にも例がある。

https://relishapp.com/rspec/rspec-core/docs/example-groups/shared-context#declare-a-shared-context-and-include-it-with-metadata

RSpec.configure には触れられていないけど、メタデータとしての指定がほしくなる経緯については↓が分かりやすい。

http://qiita.com/aereal/items/4c42f8e470ba6e061d40

↓のような雰囲気だ。

# spec/support/contexts/context1.rb
shared_context 'context1', context: 1 do
  let!(:params) { 'baz' }
end

# spec/rails_helper.rb
# ...
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
# ...
RSpec.configure do |config|
  # ...
  config.include_context 'context1', context: 1
end

# spec/models/foo_spec.rb
require 'rails_helper.rb'

RSpec.describe Foo, type: :model do
  describe '#bar' do
    context 'context1', context: 1 do # メタデータで include_context 'context1' を代替
      # params は 'baz'
      # ...
    end
  end
end

2017-07-04 以来、花火 (HANABI) を何度か遊んでいる。初回は参加しなかったが、その後は妻も参加している。記憶力のなさを痛感する。ミスを重ねている。

協力するゲームだから良いと思いがちだけど、ミスをした味方を責める形になることもあり、直接的に競争するときとは違うやりづらさがあるかもしれない。