学んだことをなぐり書き


モデルの作成

ruby script/generate rspec_model モデル名 名前:型 ...
rake db:migrate
rake db:test:prepare
$RAILS_APP/spec/models/モデル名_spec.rb が作られる。
通常の script/generate model と使い方は大体一緒らしい。

rake db:migrate をしたあとはテスト環境のデータベースに適応するために
rake db:test:prepare をしないといけない。

fixtures

テストしたい項目のデータベースの要素を列挙できる。
$RAILS_APP/spec/fixtures/モデル名の複数形.yml にある。

データ名1:
  id: 1
  要素名: 内容
データ名2:
  id: 2
  要素名: 内容
.
.
.

データ名はテスト時にどのデータを取得するかのシンボルになる。
フィクスチャをテスト時に読み込むときは describe ブロックの中で呼び出せばいい
describe モデルクラス do
  fixtures :フィクスチャファイルの名前のシンボル
end

すべてのフィクスチャを読み込みたい場合は
fixtures :all

モデルとフィクスチャの例

ここまでの手順を適当な例を使ってまとめてみる。
railsは2.3.10をrspecはgemに入っている1.3.1を使うことを前提とする。

rails _2.3.10_ hoge
cd hoge
ruby script/generate rspec
ruby script/generate rspec_model hoge text:text
rake db:migrate
rake db:test:prepare
vim spec/fixtures/hoges.yaml

フィクスチャファイルをvimで開いた後

hoge:
  id: 1
  text: ほげほげ
moke:
  id: 2
  text: もけもけ

次に spec/models/hoge_spec.rb を開いて

require 'spec_helper'

describe Hoge, "のフィクスチャを設定した場合:" do
  fixtures :hoges

  it "フィクスチャのデータは読み込まれている" do
    hoges(:moke).text.should == "もけもけ"
  end
end

specを実行してテストが成功すればおk。

spec -cfs spec/models/hoge_spec.rb

have(n).items

コレクションオブジェクトが幾つ持っているかを示す。
have(数字).(コレクションオブジェクト(ArrayとかHash))

例えばあるモデルのhogeのname要素のエラーの数を調べたい場合は
hoge.should have(1).errors_on(:name) 
これはモデルHogeのname要素はエラー数を1個持っていればテスト成功という意味になる。

change

データが変更できているかのチェックに使う。
change(チェックする変数, そのメソッド) のような形で使う。

メソッドチェインをつけることができる
なしとりあえず変更したら成功
by(value)差分がvalueだと成功
from(old).to(new)oldからnewになっていれば成功

describe "change マッチャテスト" do
  before do
    @array = []
  end

  it "メソッドチェインなし" do
    # とりあえず変更したら成功
    lambda {
      @array << 0
    }.should change(@array, :length)
  end

  it "by" do
    # 3増えてたら成功
    lambda {
      @array.push(1,2,3)
    }.should change(@array, :length).by(3)
  end

  it "from(old).to(new)" do
    # 0から2担って入れたら成功
    lambda {
      @array.push(1,2)
    }.should change(@array, :length).from(0).to(2)
    # from と to はto(new).from(old)のように逆でもOK
  end
end

その他のよく使うマッチャ

基本はこのページを参考にしてくだしあ。
適当ですいません。以下は補足。

be_validバリデーションが設定されているかどうか
have_at_least(n).itemshave(n).items とほぼ一緒。itemsが最低n個持っているという意味
have_at_most(n).items。要素が最大n個持っているという意味

メンバーのみ編集できます