shroy
shroy

Reputation: 918

Rails 4: Factory Girl & Rspec with associated Model

I previously fixed an issue with some code that works though it is a little ugly. Problem now is that it breaks my tests! The idea here is that I can create a Campaign and associate 1 zip-file and one-to-many pdfs.

Previous question and solution: Rails 4.2: Unknown Attribute or Server Error in Log

Here is the failure message:

console

  1) CampaignsController POST #create with valid params 
     Failure/Error: post :create, campaign: attributes_for(:campaign)
     ActiveRecord::RecordNotFound:
       Couldn't find Uploadzip with 'id'=
     # ./app/controllers/campaigns_controller.rb:15:in `create'
     # ./spec/controllers/campaigns_controller_spec.rb:36:in `block (4 levels) in <top (required)>'

..and the rest of the code.

spec/factories/campaigns.rb

FactoryGirl.define do
    factory :campaign do |x|
        x.sequence(:name) { |y| "Rockfest 201#{y} Orange County" }
        x.sequence(:comment) { |y| "Total attendance is #{y}" }
    end
end

spec/controllers/campaigns_controller.rb

  describe "POST #create" do
    context "with valid params" do
      before(:each) do
        post :create, campaign: attributes_for(:campaign)
      end

      .........

      end

app/controllers/campaigns_controller.rb

class CampaignsController < ApplicationController

......................

      def create
        @campaign = Campaign.new(campaign_params)

        if @campaign.save

            zip = Uploadzip.find(params[:uploadzip_id])
            zip.campaign = @campaign
            zip.save

            flash[:success] = "Campaign Successfully Launched!"
            redirect_to @campaign
        else
            ................
        end
      end

.......................

  private

      def campaign_params
        params.require(:campaign).permit(:name, :comment, :campaign_id, uploadpdf_ids: [])
      end

end

This appears simple and I assume it is, yet I've tried quit a few things and can't seem to get it to pass. How would I support the new controller logic in this test? Any help is appreciated.

UPDATE

With zetitic's advice, I created the following code in which successfully passes.

before(:each) do
  @uploadzip = create(:uploadzip)
  post :create, campaign: attributes_for(:campaign), uploadzip_id: @uploadzip
end

Upvotes: 1

Views: 197

Answers (1)

zetetic
zetetic

Reputation: 47548

Add the uploadedzip_id to the posted params:

before(:each) do
  post :create, campaign: attributes_for(:campaign), uploadedzip_id: 123456
end

Upvotes: 3

Related Questions