いくつかの属性を持つクラスで、以下のようにnewの引数に属性の初期値を渡せるようにしようとしています。
ruby
1person = Person.new(name: "John", age: 20) 2person.name #=> "John" 3person.age #=> 20
渡したハッシュの値が正しくセットされているかをRSpecでテストしようと思いましたが、実際にはもっと多くの属性があるため、DRYにしようと以下のようなテストを書きました。
ruby
1require 'rspec/its' 2 3RSpec.describe Person do 4 describe 'initial values can be passed to #initialize' do 5 let(:init_values) do 6 { 7 name: "John", 8 age: 20, 9 ... 10 } 11 end 12 subject { Person.new(init_values) } 13 14 init_values.each do |key, val| 15 its(key) { should eq val } 16 end 17 end 18end
しかし、以下のようなエラーが出ました。
text
1Failure/Error: 2 init_values.each do |key, val| 3 its(key) { should eq val } 4 end 5 6 `init_values` is not available on an example group (e.g. a `describe` or `context` block). It is only available from within individual examples (e.g. `it` blocks) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc).
そこで、letの使用をやめローカル変数にしたところ、上手く動くようになりました。
ここからが質問なのですが、RSpecではローカル変数を使わずにlet、というのが習慣なのかな、と思う(初心者なのでまだよくわかっていない)のですが、
このような場合にローカル変数を使うのはありか、あるいはもっと良い方法があるのでしょうか?
そもそもテストの設計ややり方が悪い、というご指摘もありましたらいただけると有りがたいです。
補足情報(FW/ツールのバージョンなど)
Ruby 2.5.1p57
RSpec 3.7
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。