0

私は Rails のテストを始めたばかりです。次の質問があります。コントローラーにあるこの単純なシナリオを考えてみましょう。

class UsersController < ApplicationController

  def create
    @user = User.create(params[:user])
    if params[:user][:birth_date]
      Birthday.create(:title => "#{user.first_name} #{user.last_name}'s Birthday!", :date => params[:user][:birth_date].to_date, :user_id => @user.id)
    end
  end

  def update
    @user = User.find(params[:id])
    @user.update_attributes(params[:user])
    if params[:user][:birth_date]
      @birthday = Birthday.find_by_user_id(@user.id)
      @birthday.update_attributes(:date => params[:user][:birth_date].to_date) if @birthday
    end
  end
end

ユーザーが作成されるたびに誕生日イベントが作成され、その属性が適切に設定されていることをテストしたいと思います。私の特定の(実際の)ケースでは、別のオブジェクトが作成(または更新)されると新しいオブジェクトが作成(または更新)され、多くの属性が計算されて自動的に設定されます。それらが正しく設定されていることをテストする必要があります。どうすればテストできますか?

4

2 に答える 2

0

正しいオブジェクトをテストする

ユーザーデータを入力しているオブジェクト、または場合によってはユーザーモデルのコールバックをテストする必要があります。これは通常、コントローラーの問題ではありません。特に、「ファットモデル、スキニーコントローラー」のパラダイムに従う場合はそうです。

特定のケースでは、コントローラーがBirthday#update_attributesを呼び出していますが、実際の変更は他の場所で行われているため、ここでテストします。この特定のコントローラーの唯一の本当に有用なテストは、モデルデータを作成または更新するときに何も発生しないことを確認することですが、これは単体テストというよりも統合テストです。

于 2012-10-07T21:09:05.653 に答える
0

Test :: UnitまたはRSpecを使用している場合は、「assigns」メソッドを使用してグローバル変数にアクセスできます。例として、次のようなものを使用できます。

post :update, :id => 1, :user => {:birthdate => '1/1/2000'}
assert_equal Date.new(2000, 1, 1), assigns(:user).birthday.date

データベースが正しく更新されたことをテストすることもできます。

user = User.find(1)
assert_equal Date.new(2000, 1, 1), user.birthday.date
于 2012-10-07T21:21:42.477 に答える