2014-06-20 57 views
0

我曾经环顾四周,但也许我没有在正确的位置寻找。我试图找出如何测试一个用户不能访问一个页面卫生组织控制器具有测试未经身份验证的用户Rspec/Devise

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_hel每通电话这个?

怎样运用这个正确

任何帮助表示赞赏

感谢

+0

请发表'CampaignsController'。 –

+0

似乎对我来说,你能确定你没有在某处(你在spec_helper中)调用'sign_in'方法吗?我们是否也可以拥有ApplicationController的代码? – ccyrille

+0

更新,现在思考你的意见后,你可以在 – Richlewis

回答

2

起初看起来似乎没问题。如果您运行整个套件,则可能会导致问题,并且根据您拨打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 

是,承认:我还是喜欢(使用should)老rspec的语法,它读取更自然的我。

+0

谢谢你,这是一种更好的做事方式,我同意你对可读性的看法,它更有意义,只需要帮助你想要的部分,就不会冒任何其他测试受到影响的风险。 .. – Richlewis

0

请尝试

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 
+0

恐怕同样的反应,不工作 – Richlewis

+0

你有没有得到上述代码相同的错误? – Sanket

+0

是的,我没有害怕 – Richlewis

相关问题