Ruby on rails Rails 4:Factory Girl&;带关联模型的Rspec

Ruby on rails Rails 4:Factory Girl&;带关联模型的Rspec,ruby-on-rails,ruby,rspec,tdd,factory-bot,Ruby On Rails,Ruby,Rspec,Tdd,Factory Bot,我之前修复了一些代码的问题,尽管它有点难看。现在的问题是它打破了我的测试!这里的想法是,我可以创建一个活动,并将1个zip文件和一对多PDF关联起来 以前的问题和解决办法: 以下是失败消息: 控制台 1) CampaignsController POST #create with valid params Failure/Error: post :create, campaign: attributes_for(:campaign) ActiveRecord::Rec

我之前修复了一些代码的问题,尽管它有点难看。现在的问题是它打破了我的测试!这里的想法是,我可以创建一个活动,并将1个zip文件和一对多PDF关联起来

以前的问题和解决办法:

以下是失败消息:

控制台

  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)>'
规格/控制器/活动\u控制器.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
  describe "POST #create" do
    context "with valid params" do
      before(:each) do
        post :create, campaign: attributes_for(:campaign)
      end

      .........

      end
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
应用程序/控制器/活动\u控制器.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
  describe "POST #create" do
    context "with valid params" do
      before(:each) do
        post :create, campaign: attributes_for(:campaign)
      end

      .........

      end
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

上传的zip_id
添加到发布的参数:

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

当然,测试数据库中必须存在具有该ID的行。您可能需要在before块中通过工厂创建UploadedZip,并使用其ID。完成了!我会把答案贴在我的帖子底部,相信你。谢谢