使用Factory Girl时未定义的方法`stringify_keys'

时间:2011-11-02 21:48:36

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

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

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

用于使用这些属性创建使用。然而,当我将所有这些属性移动到Factories.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)

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

  

“undefined method`stringify_keys'for ...”

新用户对象

3 个答案:

答案 0 :(得分:4)

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

您列出的第一个/顶级@user是一个哈希值,但第二个/底部@user是您的用户界面的实例(由FactoryGirl建造)在飞行中)。

如果您在规范中调用类似的内容:

user = User.new(@user)

@user的第一个(哈希)版本将起作用,但第二个(客观化)版本将不会工作(并向您抛出'stringify_keys'错误)。要正确使用@user的第二个版本,您应该在规范中使用它:

user = Factory(:user)

希望有所帮助。

答案 1 :(得分:3)

我们需要看一个诊断失败的测试示例,但这里有一件事可以导致它 - 在需要属性时发送一个对象。我曾经修改了一个失败的测试:

post :create, organization: @organization

post :create, organization: @organization.attributes

答案 2 :(得分:0)

@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
相关问题