我正在尝试发布身份验证方法:
post :authenticate, params:
{ 'email' => @user.email, 'password' => @user.password }
此用户是在 before(:each)
before(:each) do
@user = User.create([
{ name: 'Robot', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="394b565b564d795c54585055175a5654" rel="noreferrer noopener nofollow">[email protected]</a>', password: '123456', age: 10 }
])
end
但是 Rspec 正在考虑电子邮件和密码作为方法,我收到此错误
NoMethodError:
undefined method `email' for #<Array:0x00559ddd541d18>
如果我更改@user.email 和
@user.password
来串接测试通过。
我想知道我是否可以告诉 Rspec 将 .email
和 .password
视为用户的属性而不是方法。
最佳答案
您正在将包含哈希的数组传递给 create 方法。这就是为什么 Rails 将其识别为数组而不是 User 对象。
考虑这个例子:
@user = User.create email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4e2821210e2c2f3c602d2123" rel="noreferrer noopener nofollow">[email protected]</a>'
@user.email # '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97f1f8f8d7f5f6e5b9f4f8fa" rel="noreferrer noopener nofollow">[email protected]</a>'
@user.class # User(id: integer, ...)
还有:
@user = User.create([{ email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1e7871715e7c7f6c307d7173" rel="noreferrer noopener nofollow">[email protected]</a>' }])
@user.email # NoMethodError: undefined method `title' for #<Array:0x007f8701b05b28>
@user.class # Array
如果您想要迭代哈希数组,要创建某些用户,您需要迭代每个用户,然后创建用户,例如:
[
{ name: 'Robot', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="01736e636e7541646c60686d2f626e6c" rel="noreferrer noopener nofollow">[email protected]</a>', password: '123456', age: 10 }
{ name: 'Other Robot', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dbb4afb3bea99bbeb6bab2b7f5b8b4b6" rel="noreferrer noopener nofollow">[email protected]</a>', password: 'other password', ... },
].each { |user| User.create user }
但我认为现在情况并非如此。您可以只传递用逗号分隔的用户属性(散列是多余的,数组将为您提供该结果)。
尝试一下:
before(:each) do
@user = User.create name: 'Robot', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81f3eee3eef5c1e4ece0e8edafe2eeec" rel="noreferrer noopener nofollow">[email protected]</a>', password: '123456', age: 10
end
注意 before(:each)
可以缩写为 before do ... end
,并且您可以使用 let
来代替实例变量:
let(:user) { User.create name: 'Robot', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c0b2afa2afb480a5ada1a9aceea3afad" rel="noreferrer noopener nofollow">[email protected]</a>', password: '123456', age: 10 }
before { user } # before each test, creates a user named "Robot"
关于ruby-on-rails - Rspec 正在将属性视为方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47759454/