【问题标题】:Rspec is considering an attribute as a methodRspec 将属性视为一种方法
【发布时间】:2017-12-11 18:50:43
【问题描述】:

我正在尝试发布身份验证方法:

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 视为用户属性而不是方法。

【问题讨论】:

  • @user 的值是多少?
  • @LucasAndrade ,您在哪里以及如何为 Rspec 定义用户实例?你还在Rspec旁边使用工厂女孩吗?该错误表明对用户实例的查询没有给您返回单个实例(即:查找),而是给您一个数组(即:哪里)。有机会时请出示代码。如果可能,请在 before 块中显示您如何创建用户的代码以及整个测试文件。
  • @kparekh01 我在每个之前添加了我的。我现在明白了,我正在创建一个用户数组,所以我需要使用 @user[0].email @user[0].password
  • 您的方式当然可行,但无需制作数组,只需将下面的答案应用到您的 before 块中,您就可以上路了。不过很高兴你想通了。

标签: ruby-on-rails ruby testing rspec ruby-on-rails-5


【解决方案1】:

您将一个包含哈希的数组传递给 create 方法。这就是 Rails 将其识别为数组而不是 User 对象的原因。

考虑这个例子:

@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"

【讨论】:

  • 谢谢。我现在知道了。由于我只使用一个 User 对象,因此您在“Try instead:”中的解决方案可以正常工作。 before(:each) do @user = User.create name: 'Robot', email: 'robot@email.com', password: '123456', age: 10 end
  • 太好了。您还可以查看 FactoryGirl(现在称为 FactoryBot)在测试时处理固定装置的创建,它可能很有用。很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多