Это ответ, который я получил от Джо Ферриса:
factory_girl не передает аргументы конструктору.Он использует # user = в вашей модели и создает его без каких-либо аргументов.
и этот от Бена Хьюза:
Чтобы пояснить, что говорит Джо, методы after_initialize вызываются непосредственно для объектаинициализация, и это время действительно пользователь не был установлен.
Так, например, пока это будет работать:
family = Family.create!(:user => @user) # or @user.families.create ...
Это не будет (что делает factory_girl под капотом):
family = Family.new
family.user = @user
family.save!
Как правило, вы хотите быть очень осторожными, используя after_initialize, поскольку помните, что он вызывается для каждой инициализации объекта .Вызов Family.all для 1000 объектов вызовет его вызов 1000 раз.
Похоже, в этом случае вам лучше использовать before_validation вместо after_initialize.
Следующий синтаксис также работает для тестирования в rspec:
let (:family) { Family.create(:user => @user) }