我正在尝试发布身份验证方法:
post :authenticate, params:
{ 'email' => @user.email, 'password' => @user.password }
此用户是在before(:each)
before(:each) do
@user = User.create([
{ name: 'Robot', email: 'robot@email.com', password: '123456', age: 10 }
])
end
但Rspec正在考虑使用电子邮件和密码作为方法,我收到此错误
NoMethodError:
undefined method `email' for #<Array:0x00559ddd541d18>
如果我将@user.email and
@user.password
更改为字符串测试通行证。
我想知道我是否可以向Rspec说明.email
和.password
是用户的属性而不是方法。
答案 0 :(得分:4)
您将包含哈希的数组传递给create方法。这就是Rails将其识别为数组而不是用户对象的原因。
考虑这个例子:
@user = User.create email: 'foo@bar.com'
@user.email # 'foo@bar.com'
@user.class # User(id: integer, ...)
和
@user = User.create([{ email: 'foo@bar.com' }])
@user.email # NoMethodError: undefined method `title' for #<Array:0x007f8701b05b28>
@user.class # Array
如果您想迭代一系列哈希值,要创建某些用户,您需要迭代每个用户,然后创建用户,如:
[
{ name: 'Robot', email: 'robot@email.com', password: '123456', age: 10 }
{ name: 'Other Robot', email: 'other@email.com', password: 'other password', ... },
].each { |user| User.create user }
但我认为现在情况并非如此。你可以传递用逗号分隔的用户属性(哈希是多余的,数组会给你那个结果)。
尝试改为:
before(:each) do
@user = User.create name: 'Robot', email: 'robot@email.com', password: '123456', age: 10
end
注意before(:each)
可以缩短为before do ... end
,而使用实例变量,您可以使用let
:
let(:user) { User.create name: 'Robot', email: 'robot@email.com', password: '123456', age: 10 }
before { user } # before each test, creates a user named "Robot"