代码之家  ›  专栏  ›  技术社区  ›  Andrew Zelenets

如何获取具有has_and_belongs_to_many关联的FactoryGirl模型属性?

  •  3
  • Andrew Zelenets  · 技术社区  · 9 年前

    我在努力 FactoryGirl.attributes_for(:trip) 与HABTM协会 :countries 因为控制器测试失败- :国家/地区 在中缺席 :trip 属性):

    跳闸控制器:

    class TripsController < ApplicationController
      def create
        trip = Trip.new(create_params)
        if trip.save
          redirect_to trips_path, notice: 'Trip successfully created.'
        else
          redirect_to :back, alert: trip.errors.full_messages.join('<br>').html_safe
        end
      end
    
      def create_params
        params.require(:trip).permit(:end_date, :description, country_ids: [], countries: [])
      end
    end
    

    RSpec跳闸控制器测试:

    describe TripsController do
      describe 'POST #create' do
        before { post :create, trip: attributes_for(:trip) }
        it { is_expected.to redirect_to trips_path }
      end
    end
    

    跳闸模式:

    class Trip < ActiveRecord::Base
      # Associations
      has_and_belongs_to_many :countries
    
      #Validations
      validate :require_at_least_one_country
    
      private
    
      def require_at_least_one_country
        if country_ids.empty? && countries.count == 0
          errors.add(:base, 'Please select at least one country')
        end
      end
    end
    

    跳闸工厂:

    FactoryGirl.define do
      factory :trip do
        description  { Faker::Lorem.sentence }
        end_date  { DateTime.now + 1.day }
    
        after(:build) do |trip, evaluator|
          trip.countries << FactoryGirl.create(:country, :with_currencies)
        end
      end
    end
    

    宝石文件:

    factory_girl_rails (4.5.0)
    

    尝试过: http://makandracards.com/jan0sch/11111-rails-factorygirl-and-has_and_belongs_to_many ,但毫无用处。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Andrew Zelenets    9 年前

    答案如下:

    FactoryGirl.define do
      factory :trip do
        description  { Faker::Lorem.sentence }
        end_date  { DateTime.now + 1.day }
    
        after(:build) do |trip, evaluator|
          trip.countries << FactoryGirl.create(:country, :with_currencies)
        end
      end
    end
    

    FactoryGirl.attributes_for(:trip) 回报

    {
      :description=>"Eum alias tenetur odit voluptatibus inventore qui nobis.",
      :end_date=>Wed, 16 Sep 2015 11:48:28 +0300
    }
    

    .

    FactoryGirl.define do
      factory :trip do
        description  { Faker::Lorem.sentence }
        end_date  { DateTime.now + 1.day }
        country_ids { [FactoryGirl.create(:country, :with_currencies).id] }
      end
    end
    

    FactoryGirl.attributes_for(:trip) 回报

    {
      :description=>"Assumenda sapiente pariatur facilis et architecto in.", 
      :end_date=>Wed, 16 Sep 2015 11:45:22 +0300,
      :country_ids=>[4]
    }
    
        2
  •  0
  •   Alexey Shein    9 年前

    检查您是否真的发送了 countries_ids 在您的请求中。

    请使用值更新您的帖子 attributes_for(:trip) .