如何在 Factorybot 中为具有 nested_attributes 的模型创建工厂

How to create factories for models with nested_attributes in Factorybot

我想用 RSpec

测试以下控制器

coupons_controller.rb:

class Api::V1::CouponsController < ApiController
  def index
    if params[:profile_id]
      @coupons = Profile.find(params[:profile_id]).coupons
    end
  end
end

我想知道

1) 如何用 FactoryBot 创建工厂 (spec/factories/profiles.rb, coupons.rb, coupon_profiles.rb)

2)如何写spec/controllers/coupons_controllers.rb:

协会

profile.rb

class Profile < ApplicationRecord
  accepts_nested_attributes_for :coupon_profiles
end

coupon.rb

class Coupon < ApplicationRecord
  has_many :coupon_profiles
end

优惠券_profile.rb

class CouponProfile < ApplicationRecord
  belongs_to :coupon
  belongs_to :profile
end

类似于:

factory :profile, class: 'Profile', do
  ...
end
factory :coupon, class: 'Coupon' do 
  ...
end
factory :coupon_profile, class: 'CouponProfile' do
  coupon
  profile
end

老实说,你最好的选择是查看 FactoryBot 的 GETTING_STARTED 自述文件——你想知道的一切都在里面,还有例子。

对于您的控制器规格,您是否查看过 Rspec Controller Specs Documentation?您应该能够执行以下操作:

describe 'CouponsController' do 
  subject(:request) { '/index', params: params }

  shared_examples_for 'success' do
    it do
      request
      expect(response).to have_http_status(:success)
    end
  end

  describe '#index' do
    context 'empty params' do
      let(:params) { {} }

      it_behaves_like 'success'
    end

    context 'profile_id present' do
      let(:params)         { { profile_id: profile.id } }
      let!(:profile)       { coupon_profile.profile }
      let(:coupon_profile) { create :coupon_profile }

      it_behaves_like 'success'
    end 
  end
end