工厂女孩 - 在上面制作录音和通话功能

时间:2015-08-10 20:29:25

标签: ruby-on-rails activerecord rspec capybara factory-bot

每当我创建一个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将是一个私有函数,但如果它更容易使用,它可以是公共的。

2 个答案:

答案 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

请告诉我这是否适合您或您是否有任何其他问题!