Rails自定义身份验证不在控制器测试中注册sign_in用户

时间:2014-08-28 21:26:19

标签: authentication ruby-on-rails-4 rspec controller

我根据Hartl的Rails教程创建了我的身份验证系统,并且遇到了控制器测试问题。

engagements_controller_spec.rb

require 'spec_helper'

describe EngagementsController do
  describe "GET show" do
    let(:user) { FactoryGirl.create(:user) }
    before { sign_in user }

    it "assigns requested engagement to @engagement" do
      engagement = FactoryGirl.create(:engagement, user: user)
      get :show, id: engagement
      assigns[:engagement].should eq(engagement)
    end

    it "renders :show" do
      engagement = FactoryGirl.create(:engagement, user: user)
      get :show, :id => engagement.id
      expect(response).to render_template("show")
    end
  end
end

我得到的错误:

 EngagementsController GET show renders :show
 Failure/Error: expect(response).to render_template("show")
   expecting <"show"> but rendering with <[]>
 # ./spec/controllers/engagements_controller_spec.rb:37:in `block (3 levels) in < top (required)>'

 EngagementsController GET show assigns requested engagement to @engagement
 Failure/Error: assigns[:engagement].should eq(engagement)  
 expected: #<Engagement id: 42, title: "Coding", content: "Got in the zone with coding", user_id: 46, created_at: "2014-08-28 21:08:43", updated_at: "2014-08-28 21:08:43", photo_file_name: nil, photo_content_type: nil, photo_file_size: nil, photo_updated_at: nil>
        got: nil
   (compared using ==)
 # ./spec/controllers/engagements_controller_spec.rb:31:in `block (3 levels) in < top (required)>'

engagements_controller.rb

class EngagementsController < ApplicationController
  before_action :signed_in_user
  before_action :correct_user, only: [:show]

  def show
    @engagement = Engagement.find(params[:id])
  end

  private

  def correct_user
    @engagement = current_user.engagements.find_by_id(params[:id])
    if @engagement.nil? && !current_user.try(:admin)
      redirect_to root_url
    end
  end

我已经尝试过每一个没有运气的答案。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我想出了答案。在控制器之前,我有:

before { sign_in user }

但是,在控制器规范中,应禁用Capybara。因此,使用:

before { sign_in user, no_capybara: true }

让它发挥作用。

我理解为什么会这样,但还不足以解释它。如果有人有一个很好的解释,那就太棒了! :)