Как создать фабрики для моделей с nested_attributes в Factorybot - PullRequest
0 голосов
/ 10 октября 2019

Я хочу проверить следующий контроллер с 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

coupon_profile.rb

class CouponProfile < ApplicationRecord
  belongs_to :coupon
  belongs_to :profile
end

1 Ответ

0 голосов
/ 15 октября 2019

Что-то вроде:

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

Честно говоря, ваш лучший выбор - просмотреть GETTING_STARTED README для FactoryBot - там есть все, что вы хотите знать, с примерами.

Для своих спецификаций контроллера вы просмотрели документацию по спецификациям Rspec ? Вы должны быть в состоянии сделать что-то вроде:

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
...