Ruby on Railsチュートリアル5章のRspecで詰まったので解決策
実例を使ってRailsを学ぼう!
Michael Hartl (マイケル・ハートル)
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
これ、Ruby on Railsを学ぶのにとても良いweb教材だと思います
dotinstallで簡単なRailsの学習をした次はこれをやればいいんじゃないかな
前回もちょっとハマったところあったけど
Ruby on Rails チュートリアルをやってみてハマった所 -
第5章のRspecでエラーが出続ける
今回はRspecでハマりました、エラーが取れなくてパスが通らない・・・
NameError:
undefined local variable or method `root_path'
NameError:
undefined local variable or method `help_path'
NameError:
undefined local variable or method `about_path'
などなど
pathが通らないというエラーが出るなんだこれ・・・
結論としては、Rspecのバージョンの違いによってコードの文法が少し異なり
エラーが出続けていたようです
チュートリアルでは
のgemを用いていたのですが、僕はバージョンを指定せずbundle installしていたので
rspecのバージョンが3系のものがインストールされてました
ここが問題っぽかった
Transpecのgemをインストールすることで解決
解決策を探していると以下のようなところを参考にして解決しました
Ruby on Rails チュートリアル 実例を使ってRailsを学ぼう 第五章 5.3.2からエラーが出ます|teratail
Ruby - RSpecの最新の動向・RSpec 3へのアップグレードガイド - Qiita
yujinakayama/transpec · GitHub
MacOsXを用いてやったのでWindowsで正常に動作するかは確認してませんご注意を
ターミナルやコマンドプロンプトを開いて
$ gem install transpec
↓ transpecがインストールされるので
$ transpec
をすることで、rspec2.x系の記述を自動でrspec3.xに書き換えてくれます
(もし$ transpecとやって次のようなエラーが出る場合)
warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.2-compliant syntax, but you are running 2.1.1.
The current Git repository is not clean. Aborting. If you want to proceed forcibly, use -f/--force option.
forceコマンドを使えって出てるので
$ transpec -f
と打ち込んでやるとtranspecが実行されます
ちなみに実行結果(先に進んだらエラー解消されるかと思って第6章まで終わらせてからやったので、第5章の段階でやるとここの部分は異なると思います)
8 conversions
from: it { should_not ... }
to: it { is_expected.not_to ... }
6 conversions
from: it { should ... }
to: it { is_expected.to ... }
2 conversions
from: describe 'some request' { }
to: describe 'some request', :type => :request { }
1 conversion
from: be_false
to: be_falsey
1 conversion
from: describe 'some helper' { }
to: describe 'some helper', :type => :helper { }
1 conversion
from: describe 'some model' { }
to: describe 'some model', :type => :model { }19 conversions, 0 incompletes, 0 warnings, 0 errors
Rspec2とRspec3は何が違うの?
結構文法というか記述方法が異なってるみたいですね・・・
具体的には以下を参照
例えば、rspec 2.x系では it {should ...} と記述していたところを
rspec 3.x系では it {is expected.to ...} と記述しないといけない模様
このような記述に全部対応するか、もしくはrspecのバージョンを落とすかなんですが
途中でむやみにgem uninstallをすると、わけがわからなくなって動かなくなることがあるので初心者にはお勧めできません (僕もこれでハマりました・・・)
そこで上記のように便利なgem、transpecを使って解決しました
エラーが起きた場所を一応記述
エラーがとれなくなったのは具体的には
第5章、5.3.2の「Railsのルート」のところ
http://railstutorial.jp/chapters/filling-in-the-layout?version=4.0#sec-rails_routes
で、Rspecを使ってテストした際、サイト通りにパスせずエラーが出続けてしまう。
リスト5.22とリスト5.23の間にある
ルーティングが定義されたので、Help、About、Contactページのテストはパスすると思いきや
(サイト内の文章)
$ bundle exec rspec spec/requests/static_pages_spec.rb
これで、失敗するテストはHomeページを残すだけとなりました。
のところでも、helpもaboutもcontactも全てパスせず。
と。
反面、バージョンアップによって互換性が悪くなるなどありますね・・・
チュートリアルをやる場合は、やはりバージョンは合わせてやったほうがエラーが出ず
ストレスが少なくて良いかなと思います(^_^;)