Rspec正在考虑将属性作为一种方法

时间:2017-12-11 18:50:44

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

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

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

1 个答案:

答案 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"