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

cl25kdpy  于 10个月前  发布在  Ruby
关注(0)|答案(1)|浏览(111)

我想用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)如何使用FactoryBotspec/factories/profiles.rbcoupons.rbcoupon_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

k75qkfdt

k75qkfdt1#

类似于:

# spec/factories/profiles.rb
FactoryBot.define do
  factory :profile, class: 'Profile', do
    # ...
  end
end
# spec/factories/coupons.rb
FactoryBot.define do
  factory :coupon, class: 'Coupon' do 
    # ...
  end
end
# spec/factories/coupon_profiles.rb
FactoryBot.define do
  factory :coupon_profile, class: 'CouponProfile' do
    coupon
    profile
  end
end

字符串
老实说,最好的办法是查看FactoryBot的GETTING_STARTED README--你想知道的一切都在里面,还有例子。它是README的一个闪亮的例子。(注意在我上面的例子中使用class,使用字符串化的类名而不是类常量有特定的性能原因)
对于您的控制器规格,您是否查看了RSpec Documentation?尽管建议您使用更多的功能测试,如请求规格而不是控制器规格。您应该能够执行以下操作:

describe 'coupons' do 
  subject { response }

  shared_examples_for 'success' do
    before { request }

    it { should have_http_status(:success) }
  end

  describe 'GET /coupons' do
    let(:request) { get coupons_path }

    it_behaves_like 'success'
  end

  describe 'GET /coupons/:profile_id' do
    let(:request) { get coupon_path(profile)
    let(:profile) { coupon_profile.profile }
    let(:coupon_profile) { create :coupon_profile }

    it_behaves_like 'success'
  end
end

相关问题