ruby - 如何在 Factorybot 中为具有nested_attributes 的模型创建工厂
问题描述
我想用 RSpec 测试以下控制器
优惠券_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
:
协会
配置文件.rb
class Profile < ApplicationRecord
accepts_nested_attributes_for :coupon_profiles
end
优惠券.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 控制器规格文档?您应该能够执行以下操作:
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
推荐阅读
- function - 在 drupal 7 函数 _user_mail_text() 中替换 [user:name]
- azure-cosmosdb - 连接字符串缺少必需的属性:使用新 CosmosClient(CosmosConnectionString) 时出现 AccountEndpoint 错误
- c# - DDD:聚合根或实体密钥设计,密钥UUID或唯一编号应该由系统生成吗?
- c++ - cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- python-3.x - 如何从 pip3 强制卸载模块
- azure - Azure 链接 ARM 模板从文件传递参数与内联问题
- javascript - Nuxt SyntaxError: Unexpected token { at Object.Module._extensions..js
- c++ - C++:检查 LinkedList 中的回文 - 递归方法 - 错误
- html - 调整大小手柄被隐藏
- php - Laravel - 使用 $_GET 和 url 中的查询参数为结果集构建过滤器?