【问题标题】:FactoryGirl builds uninitialized object on first call, then works as expectedFactoryGirl 在第一次调用时构建未初始化的对象,然后按预期工作
【发布时间】:2014-01-17 01:11:07
【问题描述】:

使用:

  • factory_girl_rails v4.3.0
  • rails v4.0.1
  • rspec-rails v2.14.0

我对@9​​87654324@ 的第一次调用返回了一个所有nil 属性的对象。如果我再次调用它,它会按照工厂定义按预期构建对象。这是一个演示异常行为的撬动会话:

∴ rspec ./spec/controllers/admin/base_controller_spec.rb:10
Run options: include {:locations=>{"./spec/controllers/admin/base_controller_spec.rb"=>[10]}}

Frame number: 0/25

From: /Users/george/work/salescrm/spec/support/controller_helpers.rb @ line 3 ControllerHelpers#sign_in:

     2:   def sign_in(user_type = nil)
 =>  3: binding.pry
     4:     user = FactoryGirl.create(user_type) unless user_type.nil?
     5:
     6:     if user.nil?
     7:       request.env['warden'].stub(:authenticate!).
     8:         and_throw(:warden, {:scope => :user})
     9:       controller.stub :current_user => nil
    10:     else
    11:       request.env['warden'].stub :authenticate! => user
    12:       controller.stub :current_user => user
    13:     end
    14:   end

[1] salescrm(#<RSpec::Core::ExampleGroup::Nested_1>) »  FactoryGirl::VERSION
=> "4.3.0"
[2] salescrm(#<RSpec::Core::ExampleGroup::Nested_1>) »  user_type
=> :admin_user
[3] salescrm(#<RSpec::Core::ExampleGroup::Nested_1>) »  FactoryGirl.build(user_type)
=> #<User:0x007fbc8e010d68> {
                      :id => nil,
                   :email => nil,
      :encrypted_password => "",
    :reset_password_token => nil,
  :reset_password_sent_at => nil,
     :remember_created_at => nil,
           :sign_in_count => 0,
      :current_sign_in_at => nil,
         :last_sign_in_at => nil,
      :current_sign_in_ip => nil,
         :last_sign_in_ip => nil,
              :created_at => nil,
              :updated_at => nil,
                :username => nil,
              :first_name => nil,
               :last_name => nil,
              :roles_mask => nil
}
[4] salescrm(#<RSpec::Core::ExampleGroup::Nested_1>) »  FactoryGirl.build(user_type)
=> #<User:0x007fbc8533ac90> {
                      :id => nil,
                   :email => "jan@email.com",
      :encrypted_password => "$2a$04$ROK0DlxigvTmgXY.kNsdL.z3R15cbZM60UbDi4iIqMtX.C1g6Fiii",
    :reset_password_token => nil,
  :reset_password_sent_at => nil,
     :remember_created_at => nil,
           :sign_in_count => 0,
      :current_sign_in_at => nil,
         :last_sign_in_at => nil,
      :current_sign_in_ip => nil,
         :last_sign_in_ip => nil,
              :created_at => nil,
              :updated_at => nil,
                :username => "jan_blogs",
              :first_name => "Jan",
               :last_name => "Blogs",
              :roles_mask => 1
}

还有工厂:

FactoryGirl.define do
  factory :user do
    email 'joe@email.com'
    username 'joe_blogs'
    password 'my_password'
    first_name 'Joe'
    last_name 'Blogs'

    factory :admin_user do
      first_name 'Jan'
      email 'jan@email.com'
      username 'jan_blogs'
      password 'my_password'

      roles [:admin]
    end
  end
end

任何想法我做错了什么或发生了什么?谢谢。

【问题讨论】:

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


    【解决方案1】:

    FactoryGirl.build 将初始化用户对象,但不保存它,而FactoryGirl.create 将初始化并将对象保存到(测试)数据库。

    您的应用是否需要为每个用户提供唯一的电子邮件地址? factory_girl documentation 展示了如何创建一个独特的序列,您可以将其用于用户模型实例的电子邮件字段。

    【讨论】:

    • 是的,FactoryGirl.build 应该根据定义初始化对象,但这是我的问题:不是。再看一下我发布的撬动会话。您将看到对 FG.build 的调用会导致未初始化的用户对象。
    • 嗨,乔治。我相信这个问题是特定于您的 Rails 应用程序的。如果不知道更多,我会猜测。我正在使用相同版本的 factory_girl 和 rails 并且没有遇到此问题。也许您可以在 Gemfile 中使用 factory_girl 生成一个新的 rails 应用程序,看看是否可以在新应用程序中重现该问题。
    • @AndyAtkinson 我见过类似的东西。行为如下:FactoryGirl.build(:product) 无效,而 Product.new(FactoryGirl.attributes_for(:product)) 有效。问题源于一个依赖模型,在我的例子中,它是一个产品所属的Department那个模型有问题,而不是Product。错误信息在这里不是很有帮助。
    • @twopoint718 这是有道理的。 Factory Girl 尝试初始化或创建一组对象,遍历关联。如果其中之一验证或初始化失败,则相关对象将不会初始化。
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2019-12-10
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2022-12-31
    • 2021-05-01
    相关资源
    最近更新 更多