2013年8月3日土曜日

RailsでRspecとFactory Girlをインストールするサンプル

RailsではユニットテストのためにRspec、テストデータ作成のためにFactory Girlというgemが良く使われているようなので、インストール手順をまとめておく。

まず、Rspecのインストール。
通常版とRails版の両方があるようなので、両方インストールしておく。
gem install rspec
Successfully installed rspec-2.14.1
1 gem installed
Installing ri documentation for rspec-2.14.1...
Building YARD (yri) index for rspec-2.14.1...
Installing RDoc documentation for rspec-2.14.1...
gem install rspec-rails
Successfully installed rspec-rails-2.14.0
1 gem installed
Installing ri documentation for rspec-rails-2.14.0...
Building YARD (yri) index for rspec-rails-2.14.0...
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/yard-0.8.6.2/lib/yard/parse
r/source_parser.rb:98: warning: redundant nested repeat operator: /lib\/generato
rs\/**\/*_spec.rb/
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/yard-0.8.6.2/lib/yard/parse
r/source_parser.rb:104: warning: redundant nested repeat operator: /lib\/generat
ors\/**\/*_spec.rb/
Installing RDoc documentation for rspec-rails-2.14.0...
Rails版の方は良くわからない警告が出ているけれどもとりあえず大丈夫そうである。

次に、Factory Girlのインストール。
こちらも通常版とRails版の両方があるようなので、両方インストールしておく。
gem install factory_girl
Successfully installed factory_girl-4.2.0
1 gem installed
Installing ri documentation for factory_girl-4.2.0...
Building YARD (yri) index for factory_girl-4.2.0...
Installing RDoc documentation for factory_girl-4.2.0...
gem install factory_girl_rails
Successfully installed factory_girl_rails-4.2.1
1 gem installed
Installing ri documentation for factory_girl_rails-4.2.1...
Building YARD (yri) index for factory_girl_rails-4.2.1...
Installing RDoc documentation for factory_girl_rails-4.2.1...
Gemfileにも、下記のように設定を追加しておく。
group :development do
  gem 'rspec'
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end
そして、railsコマンドからRspecのインストール。
rails g rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
これでひとまずインストール完了。
下記のように、新規にmodelをgenerateすると、Rspec用のファイル(spec/models/XXX_spec.rb)とFactory Girl用のファイル(spec/factories/XXX.rb)が自動で生成されるようになる。
rails g model shake name:string
      invoke  active_record
      create    db/migrate/20130803121017_create_shakes.rb
      create    app/models/shake.rb
      invoke    rspec
      create      spec/models/shake_spec.rb
      invoke      factory_girl
      create        spec/factories/shakes.rb
新規に作成したmodelを'rake db:migrate'した後、下記のようにRspecを実行させると、一応動作する。
rake spec
Rack::File headers parameter replaces cache_control after Rack 1.5.
 [33m* [0m

Pending:
 [33m  Shake add some examples to (or delete) E:/Sites/mytest/spec/models/shake_
spec.rb [0m
 [36m    # No reason given [0m
 [36m    # ./spec/models/shake_spec.rb:4 [0m

Finished in 0.027 seconds
 [33m1 example, 0 failures, 1 pending [0m

Randomized with seed 9086
デフォルトの状態ではテスト結果がpendingになっているので、まずFactory Girl用のファイル(spec/factories/shakes.rb)を編集してテストデータを準備する。
FactoryGirl.define do
  factory :shake do
    name "First Shake"
  end
end
次に、Rspec用のファイル(spec/models/shake_spec.rb)を編集する。
ここでは、ひとまず名前だけをチェックするように設定してみる。
describe Shake do
  it 'The first name of Shake must be First Shake.' do
    shake = FactoryGirl.create(:shake)
    expect(shake.name).to eq('First Shake')
  end
end
ところが、実行するとエラーが出てしまう。
rake spec
Rack::File headers parameter replaces cache_control after Rack 1.5.
 [31mF [0m

Failures:

  1) Shake The first name of Shake must be First Shake.
      [31mFailure/Error: [0m  [31mshake = FactoryGirl.create(:shake) [0m
      [31mNameError [0m:
        [31muninitialized constant FactoryGirl [0m
 [36m     # ./spec/models/shake_spec.rb:5:in `block (2 levels) in <top (required
)>' [0m

Finished in 0.032 seconds
 [31m1 example, 1 failure [0m

Failed examples:

 [31mrspec ./spec/models/shake_spec.rb:4 [0m  [36m# Shake The first name of Shak
e must be First Shake. [0m

Randomized with seed 14976
Rspecの設定ファイル(spec/spec_helper.rb)に、Rails版のFactory Girlの設定を下記のように追加しておく必要があるようだ。
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

require 'factory_girl_rails'
設定後に再度Rspecを実行すると、無事に成功した。
rake spec
Rack::File headers parameter replaces cache_control after Rack 1.5.
 [32m. [0m

Finished in 0.09301 seconds
 [32m1 example, 0 failures [0m

Randomized with seed 4852

0 件のコメント:

コメントを投稿