RSpec 设计会话测试

RSpec Devise Session Testing

使用 rails 4.2.0 和最新版本 RSpec 我生成了一个控制器测试。

我如何确保我的管理员用户已登录?

例如:如果current_user.admin?

在 rspec 测试中,它是这样提到的:

let(:valid_session) { {} }

如何进入有效会话?

首先您需要在 spec_helper 文件中添加设计助手以便在测试中可以访问,as mentioned in the wiki

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

然后在控制器中,您可以轻松地创建一个用户对象并使用 sign_in 辅助方法

登录

第 1 步: 您可以创建自定义方法,例如在 spec 文件夹中,然后简单地使用它们(在您完成 @Mohammad AbuShady 的回答后,通常在 rspec 中默认完成)

module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in FactoryBot.create(:user, admin:true)
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in FactoryBot.create(:user)
    end
  end
end

第 2 步:

login_userlogin_admin 添加到您需要的规范文件中并更改

let(:valid_session) { {} }

let(:valid_session) { {"warden.user.user.key" => session["warden.user.user.key"]} }

我希望您正在使用 devisewarden 如果您不想担心 session/login/signup 问题,它们将非常有用。

您可以在此处查看他们的文档: plataformatec/devise wardencommunity/warden

此答案是根据设计文档编写的: devise-wiki-how-to-test