2012年4月13日金曜日

Rails3.2 + RSpecで楽しいTDD(ModelのValidationテスト)

というわけでModelのバリデーション機能をテストしていきます。

[環境]

CentOS6.2
Rails 3.2.2
Ruby 1.9.3-p125

(1)テスト対象のModel

簡易blog(食べたもの記録)アプリの記事本体部分を想定。
Modelの名前はDiningとします。
app_root/db/migrate/[date]_dinings.rbより抜粋すると

class CreateDinings < ActiveRecord::Migration
  def change
    create_table :dinings do |t|
      t.date :date      #日付
      t.string :time   #「朝」「昼」「夜」が入る
      t.string :menu #「食べたもの」
      t.integer :price  #「お値段」
      t.string :shop   #「店」
      t.string :place  #「店の場所」
      t.integer :evaluetion #1~5の5段階評価
      t.string :impression #感想
      t.string :ctype    # 写真が指定されている時写真のcontent_type
      t.binary :photo  #写真

      t.timestamps
    end
  end
end

写真データを直接DBに格納する荒っぽいモデルですが利用者が1人ということでご勘弁を。 このモデルに対して
1.必須パラメータが空の時バリデーションではじかれること
2.必須で無いパラメータが空の時バリデーションではじかれないこと
3.長さの最大長があるものに関しては境界値動作が正しいこと
を確認するためのコードを書いていきます。

(2)テストデータの準備
app_root/spec/fixtures/dinings.ymlに以下の内容のテストデータを準備します。
#coding:utf-8
valid:
  date: 2012-03-22
  time: "朝"
  menu: "おうどん"
  price: 290
  shop : "おにやんま"
  place: "五反田"
  evaluetion: 4
  impression: "おいしい"
  ctype : "image/jpeg"
  photo:
 
ここではバリデーションに引っかからないようなデータを用意しておきます。
(3)テストコードの実装
app_root/spec/models/dinings_spec.rb
にテストコードをバリバリ書いていきます。
#coding:utf-8
require 'spec_helper'

describe "Dining バリデーションテスト" do

  fixtures :dinings #テストデータを設定
  before(:each) do #全テスト実行前の共通動作
    @dining = dinings(:valid) #dinings.ymlの (valid:)で指定されているデータを設定
  end
  it "dateが空の時:エラーが発生すること" do
    @dining.date = ""
    @dining.should_not be_valid #be_validで無いことを確認する
  end

さてこれでテストを実行すると(sporkはたちあげておいて下さい)
$ rspec --drb --drb spec/models/dining_spec.rb

バリデーションコード書いてないので失敗(日付が空だけどbe_valid)します。 4.テストを通すコードの実装
というわけでテストを通すコードを書いていきます。
app_root/app/model/dining.rb
#conding:utf-8
class Dining < ActiveRecord::Base
  validates :date,
    :presence => true #dateは空を許さない
end

これでテストを再度実行すると無事テストが成功。
というようなサイクルで
テストコード→実装→テスト通った嬉しいを繰り返していくと
段々緑色が見える度に脳内麻薬が出てコード書くのにboostがかかるのでおすすめです。
あと赤色が緑にならないと気持ち悪くて寝られなくなる。
次回は写真アップロードテストのやり方あたりをメモしておきます。

0 件のコメント:

コメントを投稿