【问题标题】:undefined method `stringify_keys' while using Factory Girl使用 Factory Girl 时未定义的方法“stringify_keys”
【发布时间】:2011-12-20 17:24:06
【问题描述】:

我的 User_spec.rb 中有以下代码块:

 @user = { username:'newuser',
           email:'new@user.com',
           fname:'new',
           lname:'user',
           password:'userpw',
           password_confirmation:'userpw'}

使用这些属性创建一个使用。但是,当我将所有这些属性移至 Factory.rb 时:

require 'factory_girl'

Factory.define :user do |u|
  u.username 'newuser'
  u.email 'new@user.com'
  u.fname 'new'
  u.lname 'user' 
  u.password 'newuserpw'
  u.password_confirmation 'newuserpw'
end

并将 user_spec.rb 中的行替换为:

@user = Factory(:user)

我所有与用户模型相关的测试都失败了(例如测试电子邮件、密码、用户名等),都给了我

“未定义的方法‘stringify_keys’用于……”

新的用户对象

【问题讨论】:

  • 您是否重新加载/退出/重新进入您的测试环境?这让我很着迷。
  • @MichaelDurrant 我刚刚尝试退出/重新进入,但问题仍然存在。还是谢谢

标签: ruby-on-rails rspec ruby-on-rails-3.1 factory-bot stringify


【解决方案1】:

我遇到了类似的问题,这是因为我将 FactoryGirl 对象传递给 ActiveRecord 创建/新建方法(哎呀!)。看起来你在这里做同样的事情。

您列出的第一个/顶部@user 是值的散列,但第二个/底部@user 是您的用户对象的实例(由 FactoryGirl 构建在飞行中)。

如果您在规范中这样称呼:

user = User.new(@user)

@user 的第一个(散列)版本可以工作,但第二个(客观化)版本不会工作(并抛出“stringify_keys”错误)。要正确使用 @user 的第二个版本,您应该在规范中包含以下内容:

user = Factory(:user)

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我们需要查看一个失败测试的示例来进行诊断,但这里有一个可能导致它的原因 - 在需要属性时发送一个对象。我曾经通过更改修复了一个失败的测试:

    post :create, organization: @organization
    

    post :create, organization: @organization.attributes
    

    【讨论】:

      【解决方案3】:

      @rowanu 回答了你的问题,但让我也列出我的示例以供将来参考:

      在我的案例中失败的是:

      @user = User.new user_attr
      @user.bookings_build(Booking.new booking_attr)
      

      请注意,我正在尝试使用预订实例而不是属性哈希来构建

      工作示例:

      user_attr_hash    = FactoryGirl.attributes_for(:user)
      booking_attr_hash = FactoryGirl.attributes_for(:booking)
      
      @user = User.new user_attr_hash
      @user.bookings.build(booking_attr_hash)
      

      在 spec/factories/domain_factory.rb 我有

      FactoryGirl.define do
        factory :user do
          # DEFAULT USER...
          password "123123123"
          email "factory_girl@aaa.aaa"
          # there rest of attributes set...
        end
      
        factory :booking do
          start_date Date.today
          end_date Date.today+3
          # the rest of attributes
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多