【问题标题】:Rails 4: Factory Girl & Rspec with associated ModelRails 4: Factory Girl & Rspec 及相关模型
【发布时间】:2015-06-04 21:13:16
【问题描述】:

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

上一个问题和解决方案: Rails 4.2: Unknown Attribute or Server Error in Log

这是失败信息:

控制台

  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)>'

..以及其余代码。

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

这看起来很简单,我认为确实如此,但我已经尝试退出一些事情,但似乎无法让它通过。在这个测试中我将如何支持新的控制器逻辑?任何帮助表示赞赏。

更新

在zetitic的建议下,我编写了以下代码,成功通过了。

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

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd factory-bot


    【解决方案1】:

    uploadedzip_id 添加到发布的参数中:

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

    【讨论】:

    • 具有该 ID 的行当然必须存在于测试数据库中。您可能需要通过 before 块中的工厂创建 UploadedZip,并使用其 ID。
    • 成功了!我将在帖子底部发布答案并感谢您。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多