Ruby on Rails 単体テスト
初めて単体テストを書いてみる。
①rails既定のデータ登録用フォルダを削除
\test\fixturesフォルダを削除する。
②factry_girlのインストール
Gemfileの一番下に下記を記述する。
group :test do gem 'factory_girl_rails', '~> 1.4.0' end
コマンドプロンプトでbundle installを実行する。
bundle insatall
③factoriesフォルダの作成
\testフォルダにfactoriesフォルダを作成する。
④モデルごとにファイルを作成する。
\test\factoriesフォルダ内にusers.rbファイルを作成
データを登録するときは下記のように記述する。
FactoryGirl.define do factory :user do name "admin" password "test" end end
重複を禁止している属性を登録するときはsequenceメソッドを使って下記のように記述すると便利。
FactoryGirl.define do factory :user do sequence(:name) { |n| "admin#{n} " password "test" end end
⑤単体テストコードからFactryGirlを使用する
保存済みのモデルオブジェクトを使用するには下記のように記述する。
user = Factory(:user)
保存前のモデルオブジェクトを使用するには下記のように記述する。
user = Factory.build(:user)
\app\modelsフォルダのuser.rbに下記のようにidからuserを取得する関数がある場合
class << self def get_user(id) self.find(id) end end
\test\unitフォルダのuser_test.rbファイルに下記のようなテストを書いてみる。
test "get_user関数のテスト" do user1 = Factory(:user) user2 = get_user(user1.id) assert_equal user1.id, user2.id assert_equal user1.name, user2.name assert_equal user1.password, user1.password end
⑥単体テストを実行する
コマンドプロンプトで下記のコマンドを実行する。
rake test:units
⑦バリデーションのテストを実行する
\app\modelsフォルダのuser.rbに下記のようにバリデーションを実装している場合
validate :name, :presence => true, :uniqueness => true validate :password, :presence => true
\test\unitフォルダのuser_test.rbファイルに下記のようなテストを書いてみる。
test "名前・パスワードが空のときにバリデートでエラーになるテスト" do user = User.new assert user.invalid? assert user.errors.include?(:name) assert user.errors.include?(:password) end test "名前・パスワードが重複したときに名前のみバリデートでエラーになるテスト" do Factory(:user, :name => "admin", :password => "test") user = Factory.build(:user, :name => "admin", :password => "test") assert user.invalid? assert user.errors.include?(:name) assert_nil user.errors.include?(:password) end end
⑧単体テストを実行する
コマンドプロンプトで下記のコマンドを実行する。
rake test:units