【问题标题】:Setting protected attributes with FactoryGirl使用 FactoryGirl 设置受保护的属性
【发布时间】:2012-02-12 21:44:35
【问题描述】:

FactoryGirl 不会设置我的受保护属性user.confirmed。这里的最佳做法是什么?

Factory.define :user do |f|
  f.name "Tim"          # attr_accessible -- this works
  f.confirmed true      # attr_protected -- doesn't work
end 

我可以在使用我的工厂后做一个@user.confirmed = true,但这是在很多测试中的大量重复。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 factory-bot attr-protected


    【解决方案1】:

    您必须在创建用户时将其传递到散列中,因为 FactoryGirl 正在保护它不被批量分配。

    user ||= Factory(:user, :confirmed => true)
    

    【讨论】:

    • 在 FactoryGirl 2.1.0 上为我工作。
    • 我使用的是 2.3.2,所以可能是这样,但似乎不太可能
    【解决方案2】:

    使用after_create 挂钩有效:

    Factory.define :user do |f|
      f.name "Tim"
      f.after_create do |user|
        user.confirmed = true
        user.save
      end
    end 
    

    【讨论】:

    • 很棒的发现。工厂女孩的最新版本将语法更改为after(:create)。见getting started guide
    【解决方案3】:

    另一种方法是使用 Rails 的内置角色,如下所示:

    #user.rb
    attr_accessor :confirmed, :as => :factory_girl
    

    当大量分配 FactoryGirl 广播此角色时,使这种模式成为可能。

    优点: 使工厂保持快速、简单和干净(回调中的代码更少)
    缺点: 您正在为测试更改模型代码:(

    解决问题的一些未经测试的建议:

    • 您可以在工厂上方重新开课。
    • 您可以在 [test|spec]_helper 中重新打开课程

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2020-03-31
      • 1970-01-01
      • 2011-06-06
      • 2016-02-19
      • 2014-06-18
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      相关资源
      最近更新 更多