Rails 4:工厂女工 & Rspec 和相关模特
Rails 4: Factory Girl & Rspec with associated Model
我之前解决了一些代码的问题,尽管它有点难看。现在的问题是它破坏了我的测试!这里的想法是我可以创建一个活动并关联 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)>'
..以及其余代码。
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
将 uploadedzip_id
添加到发布的参数中:
before(:each) do
post :create, campaign: attributes_for(:campaign), uploadedzip_id: 123456
end
我之前解决了一些代码的问题,尽管它有点难看。现在的问题是它破坏了我的测试!这里的想法是我可以创建一个活动并关联 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)>'
..以及其余代码。
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
将 uploadedzip_id
添加到发布的参数中:
before(:each) do
post :create, campaign: attributes_for(:campaign), uploadedzip_id: 123456
end