2015-06-04 2 views
1

Ранее я исправил проблему с некоторым кодом, который работает, хотя он немного уродлив. Проблема в том, что она ломает мои тесты! Идея здесь заключается в том, что я могу создать кампанию и связать 1 почтовый файл и один-ко-многим PDF.Rails 4: Factory Girl & Rspec с ассоциированной моделью

Предыдущий вопрос и решение: 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)>' 

..и остальная часть кода.

спецификации/фабрики/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 

спецификации/Контроллеры/campaigns_controller.rb

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

     ......... 

     end 

приложение/контроллеры/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 

Это кажется простым, и я предполагаю, что это так, но я попытался бросить несколько вещей и, похоже, не смог его передать. Как бы я поддерживал новую логику контроллера в этом тесте? Любая помощь приветствуется.

UPDATE

С советами zetitic, я создал следующий код, в котором успешно проходит.

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

ответ

3

Добавьте uploadedzip_id к вывешенной Params:

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

все еще получаю «Не удалось найти Uploadzip с„ид“= 3» .. – shroy

+0

Строка с этим идентификатором должны, конечно, существует в тестовую базу данных. Возможно, вам потребуется создать UploadedZip через фабрику в блоке before и использовать его ID. – zetetic

+0

Сделал это! Я отправлю ответ в нижней части сообщения и займу вас. Благодаря! – shroy