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