【问题标题】:How to create models in context with factory_girl?如何在 factory_girl 的上下文中创建模型?
【发布时间】:2016-05-16 09:52:16
【问题描述】:

在我的模型中,我有一些上下文验证:

class User  
 validate :permissions, on :admin

 def permissions   
   error.add(:permissions, 'Must be set as admin') unless permissions.include? :admin  
 end
end

而且用法很简单:

user.save(context: :admin)

问题是:如何通过 factory_girl 检查验证是否在 admin 上下文中运行?例如。 create :user, context: :admin 不起作用。

【问题讨论】:

  • 您在使用 FactoryGirl 创建用户对象时是否遇到任何错误?究竟什么不起作用?
  • 如果我运行create :user 没有错误。但是如果我运行 create :user, context: :admin 我得到未定义的方法 context='`
  • 您的模型中是否定义了属性访问器?
  • 不,那样做不会错吗?
  • 尝试将attr_accessor: :permissions 添加到您的模型中

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


【解决方案1】:

我不认为 factory_girl 提供了使用该选项的createsave 方法。但是,您可以通过 factory_girl 的build 解决它

FactoryGirl.build(:user).save!(context: :admin)

attributes_for:

User.create!(FactoryGirl.attributes_for(:user), context: :admin)

【讨论】:

  • 谢谢你的想法,只是在做类似的事情
【解决方案2】:

FactoryBot 提供了一个to_create 方法,可以这样使用:

FactoryBot.define do
  factory :user do
    trait :admin do
      to_create { |instance| instance.save!(context: :admin) }
    end
  end
end

或者没有trait:

FactoryBot.define do
  factory :user do
    to_create { |instance| instance.save!(context: :admin) }
  end
end

From the docs:

默认情况下,创建记录会在实例上调用save!;自从 这可能并不总是理想的,您可以通过 在工厂中定义to_create

factory :different_orm_model do
  to_create { |instance| instance.persist! }
end

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多