August 18, 2018RSpecでのexample間共用のインスタンス生成[Computer]
Rubyのコードをいじっていて、とうとうRSpec(テスト)を書く羽目になったのですが、そこでのメモです。 こういうときは、全テスト前に実行されるbefore(:all)(←before(:context)のエイリアス)ブロックでインスタンスを生成すれば事なきを得そうですが、さらに事情が複雑で、インスタンスの生成方法を共通化したいというのがありました。常套手段としてはRSpecの外でFactory patternでも作ってそれを中で使えばよいのでしょう。だがしかし、未定義変数アクセス時に遅延評価によって変数内容を生成するRSpecの機能のlet(あるいはそのエイリアスのsubject==let(:subject))を利用してみることにしました。 そういうことで、いろいろ試してみました(別タブで見たほうが良いかも)。 spec/target_spec.rb にケースが6つ書いてあります(左側のアイコンを操作するとファイルを切り替えられます)。それぞれこんな感じです。
上の実行ボタンを押してみてください。特に[4]が意外で、インスタンス変数に代入しようとすると before(:all)で作ったものと、それぞれのテストケースの前で実行されるbeforeとで、違うものを見てしまっているようです。[5]もbefore(:all)とはスコープがことなるようで、一時変数にアクセスした際に怒られています。 [6]を使うと回避できました。インスタンス変数そのものではなく、中身についての変更でごまかしてあります。ということで[6]で目的を達成しました。おそらくバッドマウハウでしょうが…。 コメント
コメントする
|
スポンサード リンク
|