Rails 3.1.3 rspec-rails (2.11.4) rspec 2.11.1
I am new to rspec. I don't quite understand tests for POST create part.
I have generated scaffold, and simultaneously it generated controller_spec.rb as well.
it "assigns a newly created plan as @plan" do post :create, {:plan => valid_attributes}, valid_session assigns(:plan).should be_a(Plan) assigns(:plan).should be_persisted end
is the default POST create test. It raises a failure, if I changed the validations of Plan
class Plan < ActiveRecord::Base validates :give_take, :presence => true validates :flight_name_id, :presence => true validates :day_departure, :presence => true validates :weight, :presence => true end
The failure message is
1) PlansController POST create with valid params assigns a newly created plan as @plan Failure/Error: assigns(:plan).should be_persisted expected persisted? to return true, got false # ./spec/controllers/plans_controller_spec.rb:117:in `block (4 levels) in <top (required)>'
If my understanding is correct, be_persisted is testing if the newly created model instance is properly stored in DB.
I understand that my way is rather opposite: building test methods after setting actual codes. But first I need to understand RSpec.
I have also setup FactoryGirl
FactoryGirl.define do factory :plan do sequence(:give_take) { |n| [ 0, 1 ][n%2] } sequence(:weight) { | n | n } sequence(:check_in) { |c| [ true, false ][c%2] } sequence(:flight_name_id) { |n| n } day_departure Date.new(2012, 12, 1) end end
which does work.
Question: Can you show me how to pass the object to create method WITH valid attributes?
Thanks in advance
soichi