【问题标题】:Testing an unauthenticated user Rspec/Devise测试未经身份验证的用户 Rspec/Devise
【发布时间】:2014-06-20 07:53:17
【问题描述】:

我环顾四周,但也许我没有找对地方。我正在尝试找出如何测试用户无法访问其控制器具有的页面:

before_filter :authenticate_user!

理想情况下,我想同时捕获设计消息:

"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

controller_macros.rb

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 会调用这个吗?

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

【问题讨论】:

  • 请发帖CampaignsController
  • 对我来说似乎没问题,你能确保你没有在某处调用 sign_in 方法(在你的 spec_helper 中?)。我们能不能也有 ApplicationController 的代码?
  • 已更新,现在在您的 cmet 之后考虑您可能会有所收获

标签: ruby-on-rails ruby rspec devise


【解决方案1】:

乍一看似乎还可以。如果您运行整个套件,则可能会导致问题,并且根据您调用login_user 的位置,它可能会将before(: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),它读起来更自然。

【讨论】:

  • 谢谢,这是一种更好的做事方式,我同意你所说的可读性,它更有意义,并且只在你不想要的部分包含助手冒任何其他测试受到影响的风险......
【解决方案2】:

请尝试

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

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 2021-11-23
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多