2011年6月20日月曜日

Rails3 + RSpec2 + Cucumber な環境作り

表題の通り、Rails3 アプリを、RSpec2 + Cucumber を使って作ってみましょう。

rails3 アプリの骨組みづくり

まずは、rails コマンドでアプリの骨組みを作ってしまいます。
この時、オプションを特に指定しないと、デフォルトの設定のままできてしまうので、
各種オプションをつけてやります。

各種オプションってなんでしょう?

rails --help でヘルプを見てみるとこんな風に書かれています。

$rails --help
使い方:
  rails new APP_PATH [options]

オプション:
  -r, [--ruby=PATH]           # Ruby の実行パス
                              # デフォルト: /home/shinsuke/.rvm/rubies/ruby-1.9.x/bin/ruby
  -d, [--database=DATABASE]   # デフォルトで使う DB (オプション: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db)
                              # デフォルト: sqlite3
  -O, [--skip-active-record]  # Active Record 用ファイルをスキップします
  -T, [--skip-test-unit]      # Test::Unit 用ファイルをスキップします
  -J, [--skip-prototype]      # Prototype 用ファイルをスキップします
  -G, [--skip-git]            # Git ignores と keeps をスキップします

ランタイム オプション: 
  -f, [--force]    # すでにファイルが存在している場合、上書きします
  -p, [--pretend]  # コマンドを実行しますが、何も作成しません
  -q, [--quiet]    # rails コマンドのステータスを非表示にします
  -s, [--skip]     # すでにファイルが存在している場合、作成をスキップします

Rails  オプション:
  -v, [--version]  # Rails のバージョンを表示します
  -h, [--help]     # ヘルプメッセージを表示します

概要:
    'rails new' コマンドは新しい Rails アプリケーションの標準的な
    ディレクトリ構成と指定された設定ファイルを作成します。

例:
    rails new ~/Code/Ruby/weblog

    このコマンドは新しい Rails アプリのスケルトンを ~/Code/Ruby/weblog に作成します。
    まずはじめに、自動的に作成された README ファイルを読んでみましょう。

今回は、mysql を使用することにし、また javascript ライブラリは prototype.js ではなく、 jQuery を使うことにします。
さらに、この記事のタイトル通り、test フレームワークは RSpec を用います。
ですので、使用するオプションは、"-d mysql", "-T", "-J" となります。

$rails new specapp -d mysql -T -J
      create
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  log
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  public/images
      create  public/images/rails.png
      create  public/stylesheets
      create  public/stylesheets/.gitkeep
      create  public/javascripts
      create  public/javascripts/.gitkeep
      create  public/javascripts/application.js
      create  script
      create  script/rails
      create  tmp
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep

こんな感じで、あらかた自動的にアプリが作成されてくれます。

RSpec2 の導入

RSpec2 の公式サイトはコチラ (http://relishapp.com/rspec) です。
このサイトのRSpec Rails 2.6 を読んでいきましょう。

とりあえず、 gem でインストールと書いてありますが、どうせ bundler 経由で gem を管理するので、サクっと Gemfile を編集します。
公式にも書かれているとおり、:development 環境と :test 環境の2つに rspec-rails をインストールすることにしています。

group :development, :test do
  gem 'rspec-rails', '~>2.4'
end

わざわざ :development 環境が指定されているのは、 RSpec を起動するための rake コマンドで、いちいち RAILS_ENV="test" を付けるのを省力化するためです。

Gemfile の編集が終わったら、bundler 経由でインストールを済ませてしまいましょう。

$bundle update

最後に、RSpec 用ファイルの作成コマンドを実行しておしまいです。

$ruby script/rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb

これで、RSpec を動かすのに必要なファイルがそろいました。

Cucumber の導入

Cucumber の公式サイトはコチラ (http://cukes.info/) です。
rails 用のインストールドキュメントは、wiki から飛んだ、github の某ページにあります。

とりあえず、gem でインストールすればよさそうですが、この際、何でもかんでも bundler にやらせましょう
(ちなみに、こうしておけば、大抵の gem の依存関係は解決できるはずです。cucumber install document の "Install new dependenciesもスキップできます。)

Gemfile に 1 行追加します。

group :development, :test do
  gem 'cucumber-rails'
  gem 'rspec-rails', '~>2.4'
end

そしてインストールします。

$bundle update

次に、 RSpec の時と同じく cucumber 用のファイルを rails プロジェクトに追加します。
前もって --help でヘルプを読んでおくと、多分 RSpec を使うためのオプションなどを知っておくことができそうです

$ruby script/rails generate cucumber:install --rspec
      create  config/cucumber.yml
      create  script/cucumber
       chmod  script/cucumber
      create  features/step_definitions
      create  features/step_definitions/web_steps.rb
      create  features/support
      create  features/support/paths.rb
      create  features/support/selectors.rb
      create  features/support/env.rb
       exist  lib/tasks
      create  lib/tasks/cucumber.rake
        gsub  config/database.yml
        gsub  config/database.yml
       force  config/database.yml

これで、ひと通りの導入はおしまいとなります。
それでは、いよいよ実装を行っていきましょう。

2011年6月12日日曜日

とりあえず rails3 の開発環境をつくるまで

おもむろに rvm をインストールします。

次に、ruby をインストールし、使えるようにします。

shinsuke$ rvm install 1.9.2
shinsuke$ rvm use 1.9.2

現状でライブラリは何も入ってません。とりあえず rails をインストールします。

shinsuke$ gem install rails

これで、 rails コマンドや bundler が使えるようになりました。何も考えずに新しく rails アプリを作ります。アプリができたら bundle 経由で各種ライブラリを揃えておしまいです。

shinsuke$ rails new hoge_app -d mysql -T -J
shinsuke$ cd hoge_app
shinsuke$ bundle install

複数バージョンの ruby を使おう! (rvm のインストールと使用方法)

何で使うん?

ruby や php, python はバージョンが変わると地味に挙動が変化します。
ruby では、 1.8 と 1.9 でライブラリの場所が異なったり、後方互換性がなかったりとイロイロ大変です。

そこで登場したのが rvm です。

rvm を使うと、
「今日は ruby 1.9.2 を使おう!」
「やっぱり ruby 1.8 にしよう・・・」
「ruby enterprise edition もいいかな?」
と言った要望を簡単にかなえることができる様になります。

インストール

正確なインストール方法は install documentation (https://rvm.beginrescueend.com/rvm/install/) にあります。

インストール方法が2通りあり、
自分のアカウントで rvm を使う (シングルユーザー用インストール)
システム全体で rvm を使う (マルチユーザー用インストール)
です。

rvm では、シングルユーザー用インストールが推奨されています
rvm の主な目的としては ruby で何かを開発するために、いろいろなバージョンを試したりするために使用すると予測されます。
シングルユーザー用インストールでは、ホームディレクトリ以下に設定ファイルや gem ディレクトリができ、ユーザー毎に違った設定を行えます。
つまり、他のユーザーの環境へは影響を与えないためにシングルユーザー用のインストールが推奨されているのです。

と、いうわけでシングルユーザー用インストールを見てみましょう。

インストール方法は簡単でシェルで

user$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

を実行するだけです。

インストールドキュメントにも書いてありますが、 https://rvm.beginrescueend.com/install/rvm の中身をきちんと理解しておくことが推奨されています。

当たり前ですが、インターネットから取ってきたシェルスクリプトを実行する前には、中身に軽く目を通しておきましょう。

次に、.bash_profile に rvm へのパスを通します。

user$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile

を実行し、

user$ source .bash_profile

で .bash_profile を再読込します。

成功していれば

user$ rvm notes

で、 rvm のノートが表示されるはずです。

簡単な使い方

user$ rvm install 1.9.2

で、ruby 1.9.2 がインストールできます。

user$ rvm use 1.9.2

で、インストールした ruby 1.9.2 が使え、

user$ rvm remove 1.9.2

で、ruby 1.9.2 をアンインストールできます。

user$ rvm list known

で、インストール可能な ruby のバージョンが一覧で表示され、

user$ rvm list

で、インストール済みの ruby のバージョンが一覧で表示されます。

gem とか、ruby 製のツールは?

ruby の各種ツールは ~/.rvm/gems/{バージョン}/bin/ に置かれ、 gem は ~/.rvm/gems/{バージョン}/gems におかれます。

つまり、依存関係とか、バージョンの違いとか、その手の面倒くさくて死にそうな作業から一挙に解放されます。ヒャホーイ

user$ rvm use 1.9.2
user$ rvm use 1.8.7

などで、 ruby のバージョンを切り替えた後、

user$ gem list --local
user$ rake --version
user$ which gem

などを実行してみると、見事にバージョンによって中身が全部切り替わっていることがわかるかと思います。