3

我的 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’用于……”

新的用户对象

4

3 回答 3

4

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

您列出的第一个/顶部 @user 是 values 的哈希值,但第二个/底部 @user 是您的 User ojbect 的一个实例(由 FactoryGirl 即时构建)。

如果你在你的规范中调用这样的东西:

user = User.new(@user)

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

user = Factory(:user)

希望有帮助。

于 2011-11-21T16:22:06.333 回答
2

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

post :create, organization: @organization

post :create, organization: @organization.attributes
于 2012-02-06T02:59:23.517 回答
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
于 2014-05-30T09:31:25.517 回答