RSpec + Capybara + Devise:current_user?

时间:2017-12-14 18:22:53

标签: ruby-on-rails rspec devise capybara

  • rails(5.1.4)
  • rspec-rails(3.7.2)
  • capybara(2.16.1)
  • 设计(4.3.0)

我正在尝试按https://relishapp.com/rspec/rspec-rails/v/3-7/docs/system-specs/system-spec创建一个RSpec Rails 3.7系统规范。

此外,我想申请设计授权。我按照说明https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

但我想这是一种有缺陷的实施。我没有得到current_user方法(nil)。

这是我的简单规范:

require 'rails_helper'

RSpec.describe "testing system", type: :system do

  it "tests the spec" do

    admin = create(:admin) # user-admin

    login_as(admin, :scope => :admin)

    visit root_path

    click_link 'Home'

    save_and_open_page

  end
end

由于我网站上的代码在很大程度上取决于current_user值,因此我没有得到正确形成的已保存页面(看起来用户没有登录)。

我该怎么办?我应该尝试简单地手动(以某种方式?)为current_user分配一个值吗?或许https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara策略主要是有缺陷的,应该用更全面的技术代替?

我已经尝试过了

current_user = admin

在我的代码中 - 但没有结果。

1 个答案:

答案 0 :(得分:2)

设计wiki对于如何在快捷登录时进行测试是正确的,并且你不能只在测试代码中设置current_user(也不能访问它,因为它只设置在里面请求)。通常假设错误在于您使用宝石,而不是广泛使用且经过高度测试的宝石有缺陷。

根据您提供的说明,可能有多种原因导致它实际上没有登录用户,但最可能的两个罪魁祸首是

  1. 你真的在Devise中配置了多个范围吗?或者只是login_as(admin, :scope => :user)#等同于login_as(admin)

  2. puma是在单一模式还是群集模式下运行测试? (您可能需要禁用puma输出的静音输出rspec-rails默认情况下 - https://github.com/rspec/rspec-rails/blob/95f4522c0549a32de59c19eb9b5f9a72126a9eb6/lib/rspec/rails/example/system_example_group.rb#L72 - 在测试输出中看到它)如果它不在单一模式下则应用程序正在运行分开的过程比测试意味着Devise实际上不能使登录短路,你需要修复puma配置。