每当我创建一个User时,我想在该用户上调用build_user_group。我在User模型上使用after_save:build_user_group来执行此操作,但是当FactoryGirl创建用户时,从不执行build_user_group。如何从工厂内部调用它或确保FactoryGirl不跳过回调?
# app/models/user.rb
class User < ActiveRecord::Base
belongs_to UserGroup
after_save :build_user_group
def build_user_group
if self.user_group_id.present?
self.user_group.update!(newest: self.name)
else
group = UserGroup.new(newest: self.name)
group.user << self
group.save!
end
end
end
-
# spec/factories.rb
FactoryGirl.define do
factory :user do
name "Default Name"
build_user_group #ArgumentError: Trait not registered: build_user_group
end
end
我没有正确地调用build_user_group。它认为我正在尝试访问具有该名称的特征。什么是正确的称呼方式?
理想情况下,build_user_group将是一个私有函数,但如果它更容易使用,它可以是公共的。
答案 0 :(得分:2)
您可以在FactoryGirl中使用回调来调用您的方法:
factory :product do
name "Default Name"
after(:build) do |p|
p.build_user_group
end
end
我认为在使用工厂构建产品时不会调用该方法,因为FactoryGirl strategy是:build
而不是:create
(尽管您的问题是“创建”) 。如果在创建产品时没有调用该方法,则可能存在更深层次的问题,即为什么不调用模型回调。
答案 1 :(得分:1)
您可以在RSpec测试中嘲笑它:
context "...." do
it "...." do
user_group = double("user_group")
allow(user).to receive(:build_user_group).and_return(:user_group)
expect(....).to eq(....)
end
end
有关RSpec文档的详细信息,请参阅here。
请告诉我这是否适合您或您是否有任何其他问题!