Martin
Martin

Reputation: 11336

FactoryGirl.attributes_for(:item) not passing on POST #create

I try to pass these two create controller specs but for some reason it it not validating the Item object. Could it be that FactoryGirl.attributes_for(:item) are missing the profile and attachment required associations? If so, how can I pass it to attributes too?

  describe "POST #create" do

    context "signed in" do 
      login_user

      context "with valid attributes" do 
        it "creates a new item" do
          expect{
            post :create, trend: FactoryGirl.attributes_for(:item)
            }.to change(Item,:count).by(1)
        end
        it "redirects to the home page" do 
          post :create, item: FactoryGirl.attributes_for(:item)
          response.should redirect_to Item.last 
        end
      end

    end

I got these errors

Failures:

  1) ItemsController POST #create signed in with valid attributes creates a new item
     Failure/Error: expect{
       count should have been changed by 1, but was changed by 0
     # ./spec/controllers/items_controller_spec.rb:42:in `block (5 levels) in <top (required)>'

  2) ItemsController POST #create signed in with valid attributes redirects to the home page
     Failure/Error: response.should redirect_to Item.last
       Expected response to be a <redirect>, but was <200>
     # ./spec/controllers/items_controller_spec.rb:48:in `block (5 levels) in <top (required)>'

This is the Item factory

FactoryGirl.define do
  factory :item do
    profile

    after(:build) do |item|
      item.attachments << FactoryGirl.build(:attachment, attachable: item)
    end
  end

end

Upvotes: 0

Views: 311

Answers (1)

Neil Billingham
Neil Billingham

Reputation: 2285

I guess doing FactoryGirl.attributes_for isn't actually a build, so the after(:build) won't fire. How about this:

FactoryGirl.attributes_for(:item, :profile_attributes => FactoryGirl.attributes_for(:profile), :attachments => [FactoryGirl.attributes_for(:subject)])

Probably a good idea to try this line in the rails console first to see what the hash comes out like :)

Upvotes: 1

Related Questions