如何在 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
我想用 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