ruby-on-rails - Rspec 正在将属性视为方法

标签 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: '<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/

相关文章:

使用 'sudo' 和不使用 sudo 时出现 RubyGems 安装错误

php - Symfony 5 Api 测试 createClient() LogicalException

javascript - 无法读取试图进行任何操作的源文件夹

ruby-on-rails - 重命名 Ruby on Rails 应用程序

ruby - Jekyll:如何在 GitHub 页面上使用自定义插件?

ruby-on-rails - 需要 Twitter 和 Facebook Gems 的推荐

scala - specs2 scala 测试中 OneAppPerSuite 的替代方案

ruby-on-rails - 将 Node 模块导入到 Rails 中

ruby-on-rails - Rails - 根据用户选择动态设置时区

ruby-on-rails - 具有多个应用程序的 SimpleCov - 或者简而言之,Simplecov 是如何工作的?