【问题标题】:RSpec & Devise authentication don't worksRSpec & Devise 身份验证不起作用
【发布时间】:2015-02-01 10:32:48
【问题描述】:

我在使用 RSpec 和 Devise 时遇到了非常奇怪的问题

  describe 'GET edit:/id' do 
    before do 
      @job = FactoryGirl.create(:job)
      get(:edit, id: @job.id)
    end

    context 'as not authorized' do
      before { logout(:user) }
      it 'redirects to login page' do
        expect(response).to redirect_to new_user_session_path
      end
    end

    #it '' do end << works if i uncomment this line

     context 'as authorized' do
      before { login_as(user) }
      it 'renders edit tempalte' do
        expect(response).to render_template :edit
       # Here I get response.status 302. It must be 200, controller thinks that user is not authorized.
       # But if add empty 'it' keyword, everything works fine
      end
    end
  end

控制器的前置过滤器

before_filter :authenticate_user!, except: [:index, :show]

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec devise bdd


    【解决方案1】:

    我不知道为什么添加空的 'it' 关键字后一切正常。

    但是,我知道为什么 context 'as authorized' 不能正常工作。 我试过了,代码运行良好。

    规格文件。我改变了2行。请看cmets。

    # spec/controllers/jobs_controller.rb
    require 'rails_helper'
    
    RSpec.describe JobsController, :type => :controller do
      describe 'GET edit:/id' do
        context 'as not authorized' do
          before do
            @job = FactoryGirl.create(:job)
            get(:edit, id: @job.id)
          end
          it 'redirects to login page' do
            expect(response).to redirect_to new_user_session_path
          end
        end
    
        context 'as authorized' do
          before do
            user = FactoryGirl.create(:user) # add here
            sign_in(user)  # change
            @job = FactoryGirl.create(:job)
            get(:edit, id: @job.id)
          end
    
          it 'renders edit tempalte' do
            expect(response).to render_template :edit
          end
        end
      end
    end
    

    将 Devise 的测试助手添加到 rails_helper.rb

    # spec/rails_helper.rb
    # Add this line to provide Devise's test helpers
    # Ref: https://github.com/plataformatec/devise#test-helpers
    config.include Devise::TestHelpers, type: :controller
    

    工厂文件。

    # spec/factories/users.rb
    FactoryGirl.define do
      factory :user do
        email 'test@email.com'
        password 'password'
      end
    end
    

    奔跑成功!!

    rspec spec/controllers/jobs_controller_spec.rb
    ..
    
    Finished in 0.09395 seconds (files took 2.31 seconds to load)
    2 examples, 0 failures
    

    【讨论】:

    • 感谢您的回复,但我不明白您的意思,您能提供代码吗?
    • 我的意思是,在您之前login_as(user)(第 2 位),您请求 get(:edit, id: @job.id)(第 1 位)。所以,设计返回 unauthorized 状态码 302
    • 我已经更新了这个gist.github.com/lekishvili/53cd2329df39e61762c3,但遇到了同样的问题
    • 感谢您分享您的代码。我尝试过并编辑了答案。请看他们。
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多