Ruby on Rails/第14回勉強会 - Rails上でRspecを使う http://www.ark-web.jp/sandbox/wiki/253.html
Ruby on Rails/第14回勉強会 - Rails上でRspecを使う
どうも、SEの小沼です。
このページは? †
下記のネタを元にRspecについて勉強してみるページです。
- Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)
http://jp.rubyist.net/magazine/?0021-Rspec
- File: TUTORIAL.ja
http://kakutani.com/trans/rspec/TUTORIAL_ja.html
今回は第3回ということで前回までの続きです。
前回でRspecの使い方までをご説明しました。
今回はRspecをRuby on Rails上で使う方法をご紹介します。
- 第一回はこちら
Ruby on Rails/第12回勉強会 - Rspec概要
動画 †
http://www.screencast.com/t/b4eymGMn
目次 †
日時 †
- 2007/10/26(金)
参加者 †
動画 †
本編 †
インストール †
- Ruby on RailsでRspecを利用する場合、以下の二つのインストールが必要です。
- Rspec自体
- Rspec on Rails
$ ./script/plugin install svn://rubyforge.org/var/svn/rspec/tags/REL_1_0_8/rspec ...略... $ ./script/plugin install svn://rubyforge.org/var/svn/rspec/tags/REL_1_0_8/rspec_on_rails ...略...
必要なファイルの生成 †
- rails環境作成
$rails rspec_test
- Rspec関連ファイルの作成。
$ ruby script/generate rspec
- 作成されたファイル、ディレクトリの説明
spec/ スペックファイルを配置するルートディレクトリです。Rails 標準のテスティング環境の test/ ディレクトリに相当します。 spec/spec_helper.rb RSpec を Rails で使用するためのヘルパです。アプリケーションに共通する RSpec 関連の処理を記述します。Rails 標準のテスティング環境の test/test_helper.rb に相当します。 sepc/spec.opts Rake 経由で RSpec を実行する際に、spec コマンドへ渡すオプションを設定します。 script/spec_server Rails 環境をロードしたテスト用の dRuby サーバを起動します。テストの実行を速くすることが目的です。次回以降の連載で言及します。 script/spec 開発対象の Rails アプリケーション用の spec コマンドです。スペックファイルを指定して実行する場合に使用します。
- 参考:RSpec on Rails でインストールされる rake タスク
http://jp.rubyist.net/magazine/?0021-Rspec#l54
- RSpec on Rails のテスト用ディレクトリ構成
http://jp.rubyist.net/magazine/?0021-Rspec#l55
サンプルを動かしてみる †
今回のサンプルについて †
- modelのスペックを記述します
- Blog
準備 †
- database.ymlの編集
- サンプルではsqlliteを使ってるみたいですが、一般的なmysqlを使ってやってみます。
- ですので、database.ymlを編集します。
- かつdatabaseを事前に作成します。
mysqladmin create rspec_test
モデルの開発 †
モデルのビヘイビア駆動開発は以下のようなフローになる。
- モデル作成
$ ruby script/generate rspec_model xxxモデル名
- マイグレーションファイルを編集する
- データベースを更新する
rake db:migrate
- フィクスチャを編集する
- スペックを定義する
- モデルを実装する
重要な点 †
change マッチャ
処理の実行前と実行後での変化を定義するマッチャ
lambda { team.add_player(player) }.should change(roster, :count) //teamにadd_playerするとteamのcoutの値が変化するということを定義
以下のような使い方が可能
- メソッドチェインなし
- とにかく変化することを定義
lambda { team.add_player(player) }.should change(roster, :count)
- とにかく変化することを定義
- byの値だけ変化することを定義
lambda { team.add_player(player) }.should change(roster, :count).by(1)
- fromからtoに変化することを定義
string = "string" lambda { string.reverse }.should change { string }.from("string").to("gnirts") # change マッチャに ブロックを渡す場合には、{} の形式で渡してください。 # 「do...end」形式はサポートされません。
- 実行後にtoに変化していることを定義
lambda { somevalue = "hogehoge" }.should change {somevalue}.to("hogehoge")
問題 †
/home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/action_controller/rescue.rb:19: undefined method `alias_method_chain' for ActionController::Rescue:Module (NoMethodError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:147:in `require' from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions.rb:6 from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:147:in `require' from /home/staff/konuma/test/rails/rspec_test/config/../vendor/plugins/rspec_on_rails/lib/spec/rails.rb:17 from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:147:in `require' from ./spec/models/../spec_helper.rb:5 from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from ./spec/models/blog_spec.rb:1 from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec/lib/spec/runner/behaviour_runner.rb:106:in `load_specs' from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec/lib/spec/runner/behaviour_runner.rb:105:in `load_specs' from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec/lib/spec/runner/behaviour_runner.rb:49:in `prepare!' from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec/lib/spec/runner/behaviour_runner.rb:19:in `run' from /home/staff/konuma/test/rails/rspec_test/vendor/plugins/rspec/lib/spec/runner/command_line.rb:17:in `run'
- ん?alias_method_chainが見えていないようだ?
- alias_method_chainはrailsの拡張したmodelクラスに定義されているメソッド。
- そこでspec/spec_helper.rbに以下の行を追加
require File.expand_path("/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/core_ext/module.rb")
- そしたら動いた。
- そこでspec/spec_helper.rbに以下の行を追加
まとめ †
- changeマッチャのやり方とかに美学というか意地を感じる。
tag: Ruby on Rails, 勉強会,テスト