質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

1回答

6232閲覧

RSpecのexample外での変数使用

takara7

総合スコア107

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

0クリップ

投稿2018/05/29 04:59

いくつかの属性を持つクラスで、以下のように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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

before などの例でよく出てくるように @init_values などの値か、あるいは初期化済みのインスタンスを @person として各テストで利用することは通常のやり方だと思いますよ。
ただし、テストの実行順は保証されないので、中身を書き換えるテストがある場合は before :each で毎回作成するか、テストケースごとにローカル変数で定義した方がいいと思います。

具体例は調べたら出てくると思うので省略します。

投稿2018/05/29 06:31

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問