期待どおりに動作する次の 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
しかし、アクションのすべてのパラメーターを宣言しているため、面倒です。
明示的なパラメーターの代わりに、ファクトリによって作成されたオブジェクトを渡す方法があるはずですが、構文がどのように機能するかはわかりません。
任意のヒント?