ruby 如何使用factory_bot构建缺少访问器方法的对象?

t3psigkw  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(118)

给定一个缺少访问器方法的数据模型,

class Person
  attr_reader :name # but NO attr_accessor
  def initialize(name)
    @name = name
  end
end

FactoryBot.define do
  factory :person do
    name { 'Grace' }
  end
end

如何使用factory_bot构建Person?如果我们尝试build :person,我们会得到:

NoMethodError .. undefined method `name='

我写了一个自定义构建策略,它可以工作,但我对它不满意,因为我必须使用instance_variable_get来访问私有库对象。

class BuildNew
  def association(runner)
    runner.run
  end

  # @param evaluation [FactoryBot::Evaluation]
  def result(evaluation)
    attributes = evaluation.hash
    model_class = evaluation.instance_variable_get(:@attribute_assigner).send(:build_class_instance).class
    model_class.new(attributes)
  end
end
FactoryBot.register_strategy(:build_new, BuildNew)
eqoofvh9

eqoofvh91#

看起来自定义构建策略是不必要的。使用initialize_with可以更简单地完成此操作。

FactoryBot.define do
  factory :person do
    initialize_with { new(attributes) }
    name { 'Grace' }
  end
end

相关问题