【问题标题】:FactoryGirl creates incomplete modelFactoryGirl 创建不完整的模型
【发布时间】:2013-10-21 11:37:55
【问题描述】:

假设我有一个城市模型,其中:

class city
  field :full_name, type: String # San Francisco, CA, United States
  field :_id, type: String, overwrite: true, default: ->{ full_name }
end

假设我在 /spec/factories/cities.rb 中定义了一个工厂:

FactoryGirl.define do
  factory :city do
    full_name 'San Francisco, CA, United States'
  end
end

在其中一个规范中运行以下代码:

city_attrs = { full_name: 'San Francisco, CA, United States' }
City.create! city_attrs
=> #<City _id: San Francisco, CA, United States, full_name: "San Francisco, CA, United States">

FactoryGirl.create(:city)
=> #<City _id: , full_name: "San Francisco, CA, United States">

如何在不将以下代码添加到 /spec/factories/cities.rb 的情况下解决此问题?

before(:create) do |city, evaluator|
  city.id = city.full_name
end

编辑 解决方案是停止使用FactoryGirl,而是按照this answer 中的建议使用Fabrication

【问题讨论】:

  • 为什么不直接添加代码?
  • 在某些情况下,模型将具有回调过程,这将改变它的许多属性...我希望 FactoryGirl 创建遵循此回调,而不是提供此类回调before(:create)
  • 如果您不使用ActiveRecord,请您至少提及您正在使用的数据库适配器吗?
  • 你试过打电话给apply_defaults 吗?
  • apply_defaults 没用

标签: ruby-on-rails rspec mongoid factory-bot rspec-rails


【解决方案1】:

你需要重写FactoryGirl使用的模型的初始化:

FactoryGirl.define do
  trait :explicit_initialize do
    initialize_with { new(attributes) }
  end

  factory :city, traits: [:explicit_initialize] do
    full_name 'San Francisco, CA, United States'
  end

end

【讨论】:

    【解决方案2】:

    就像文档中的解释一样,lambda 中的所有默认定义都是惰性的。所以你需要预处理它:

    将默认值定义为 proc 时,Mongoid 将在设置所有其他属性后应用默认值。如果您希望这在其他属性之前发生,请设置 pre_processed: true。

    class city
      field :full_name, type: String # San Francisco, CA, United States
      field :_id, type: String, overwrite: true, pre_processed: true, default: ->{ full_name }
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多