Factory Girl - 在上面制作录音和通话功能

Factory Girl - Make record and call function on it

每当我创建一个用户时,我想对该用户调用 build_user_group。我在用户模型上使用 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 将是一个私有函数,但如果这样更容易使用,也可以是 public。

您可以在 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

让我知道这是否适合你,或者如果你有任何其他问题!

您可以在 FactoryGirl 中使用回调来调用您的方法:

factory :product do
  name "Default Name"
  after(:build) do |p|
    p.build_user_group
  end
end

我认为当您使用工厂构建产品时不会调用该方法,因为您的 FactoryGirl strategy:build 而不是 :create (尽管您的问题是 'create').如果它在您创建产品时没有调用该方法,那么可能存在更深层次的问题,即为什么您的模型回调没有被调用。