0

期待どおりに動作する次の new および create アクションがあります (ブラウザーを使用して以下のタスクを実行すると、動作します)。

def new
  @user = User.find(params[:user_id])
  @profile = @user.build_profile
end

def create
  @user = User.find(params[:user_id])
  @profile = @user.build_profile(params[:profile])
  respond_to do |format|
    if @profile.save
      format.html { redirect_to user_dashboard_path(@user, @user.dashboard), notice: 'Profile was successfully created.' }
      format.json { render action: 'show', status: :created, location: @profile }
    else
      format.html { render action: 'new' }
      format.json { render json: @profile.errors, status: :unprocessable_entity }
    end
  end
end

しかし、工場を使用して作成アクションのクリーンな rspec テストを作成する方法がわかりません。

私は動作する次のテストを持っています:

before(:each) do
  @user = FactoryGirl.create(:admin)
  sign_in @user
end

it "creates a new Profile" do
  @profile = User.find(@user.id).build_profile #because this typically happens before in my 'new' action

  expect {
    post :create, :user_id => @user.id, :profile => {"first_name"=>"string",
     "middle_name"=>"string",
     "last_name"=>"string",
     "phone_number"=>"3213213211",
     "birth_date(1i)"=>"2013",
     "birth_date(2i)"=>"7",
     "birth_date(3i)"=>"4"}
  }.to change(Profile, :count)
end

これを私の工場として使用する:

FactoryGirl.define do
  factory :profile do
    first_name "MyString"
    middle_name "MyString"
    last_name "MyString"
    phone_number 2108545339
    birth_date Date.new(1987,8,11)
  end
end

post :createしかし、アクションのすべてのパラメーターを宣言しているため、面倒です。

明示的なパラメーターの代わりに、ファクトリによって作成されたオブジェクトを渡す方法があるはずですが、構文がどのように機能するかはわかりません。

任意のヒント?

4

1 に答える 1