我的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 ...”
新用户对象
答案 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