読者です 読者をやめる 読者になる 読者になる

ネット偽善者でもいいじゃない

悩んでるなら面白いマンガ読もう

Ruby on Railsチュートリアル5章のRspecで詰まったので解決策

プログラミング Ruby Rails

Ruby on Rails チュートリアル

実例を使って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 'rspec-rails', '2.13.1'

の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 3の重要な変更 - 有頂天Ruby

 

例えば、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も全てパスせず。

と。

 

 

Rubyはまだまだ発展してて便利なツールも増えているけど

反面、バージョンアップによって互換性が悪くなるなどありますね・・・

チュートリアルをやる場合は、やはりバージョンは合わせてやったほうがエラーが出ず

ストレスが少なくて良いかなと思います(^_^;)