当前位置: 首页 > 知识库问答 >
问题:

测试未经验证的用户Rspec/Devise

乐正浩宕
2023-03-14

我环顾了一下四周,但也许我找的地方不对。我试图找出如何测试用户无法访问其控制器具有以下功能的页面:

before_filter :authenticate_user!

理想情况下,我希望同时捕获Desive信息:

"you need to sign in or sign up before continuing"

到目前为止,我有这个

require 'spec_helper'

describe CampaignsController do

  it "should not allow a user be able to access without being authenticated" do
    get :index
    response.should redirect_to(new_user_session_path)
  end

终止

目前我得到了错误

Failure/Error: response.should redirect_to(new_user_session_path)
Expected response to be a <redirect>, but was <200>

活动控制器

class CampaignsController < ApplicationController
  before_filter :authenticate_user! 

def index
  @campaigns = Campaign.all
end
end

在我的规范助手中,我调用以下内容

# Include Devise Test Helpers
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller

控制器\u宏。铷

module ControllerMacros

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

在这个阶段,我不称之为login_user方法,那么spec_helper会称之为这个吗?

我如何正确处理这个问题?

共有2个答案

朱运诚
2023-03-14

请试一试

module ControllerMacros

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

在rspec文件中

require 'spec_helper'

describe CampaignsController do

  it 'for authenticate user' do
    before do
      login user
    end
  end

  it "should not allow a user be able to access without being authenticated" do
    get :index
    expect(response).to redirect_to(new_user_session_path)
  end
长孙景天
2023-03-14

乍一看似乎还可以。如果您运行整个套件,并且根据调用login\u user的位置,它可能会在(:each)之前将添加到所有测试中,则可能会导致此问题。

我知道您希望尽量减少键入,但通常我更希望我的测试更明确一些:我想看看规范中发生了什么。

所以我通常是如何编写这种测试的:

describe HomeController do
  include Devise::TestHelpers

  context "when not signed in" do
    describe "GET 'index'" do
      it "redirects to sign in" do
        get 'index'
        response.should be_redirect
      end
    end
    describe "GET 'about'" do
      it "returns http success" do
        get 'about'
        response.should be_redirect
      end
    end
  end

  context "when signed in" do
    before do
      user = FactoryGirl.create(:user)
      sign_in(user)
    end
    describe 'GET :index' do
      it "returns http success" do
        get 'index'
        response.should be_success
      end
    end
    describe "GET 'about'" do
      it "returns http success" do
        get 'about'
        response.should be_success
      end
    end
  end
end

是的,我承认:我仍然喜欢旧的rspec语法(使用should),它对我来说更自然。

 类似资料:
  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • 我们使用 EWS 托管服务已经有一段时间了,但我们希望过渡到使用 Office 365 的 RESTful API。 应用程序是否可以在未经用户同意的情况下访问我们所有的用户数据?我们有一个内部应用程序,我们希望将一些O365/Sharepoint数据提供给我们的用户。使用SSO并不是一个真正的选择,因为我们不想一直要求我们的用户给予同意(我们假设他们已经给予同意)。具体来说,我们想要访问日历和邮

  • 当与应用程序相关的身份验证功能未正确实现时,它允许黑客利用其他用户凭据破坏密码或会话ID或利用其他实施缺陷。 下面我们借助简单的图表来了解这个漏洞的威胁代理,攻击向量,安全弱点,技术影响和业务影响。 威胁代理 - 匿名外部攻击者以及拥有自己帐户的用户可能会尝试从其他人那里窃取帐户。 攻击者的方法 - 在身份验证或会话管理功能中使用泄漏或漏洞。例如,公开的帐户密码,用于冒充用户的会话ID。 安全弱点

  • 我尝试postman使用用户名和密码连接到我的一个web服务,每次更改用户名时,即使用户名与我放在属性文件中的用户名不相同,请求也会被验证

  • 我对Firebase及其电子邮件验证流程有疑问。我可以创建一个新用户,电子邮件与一个链接,以验证电子邮件地址是交付没有问题。现在,出于测试目的,我不会点击链接来验证电子邮件,但是,如果我打开应用程序,我可以访问并执行任何操作。我不确定我错过了什么或者我做错了什么。过去几天我一直被这个困扰着。非常感谢任何帮助。 我的代码 预期结果 新创建的用户应该不能登录和打开应用程序,除非电子邮件得到验证。

  • 我有一个控制器方法,它使用<code>redirect_to:back<code>将用户重定向回原始页面。方法如下所示。 我试图为有效和无效的创建方法编写一个集成测试。下面给出了集成测试。 我得到以下与。 我尝试在创建方法中使用HTTP REFERRER(如下所述)而不是redirect_to:back,但我仍然收到错误。 我不确定我需要改变什么来通过redirect_to :back的测试。我曾