2014-08-28 1 views
1

Я создал свою систему аутентификации на основе Rails Tutorial Hartl и у меня проблемы с проверками контроллера.Rails custom auth не регистрирует пользователя sign_in в тестах контроллера

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 

Я пробовал каждый ответ, который я мог найти без везения. Любая помощь будет высоко оценена!

+0

Спасибо за изменения, @zishe. Это был мой первый пост на SO, но я буду уверен, что это не повторится. :) – rgpass

ответ

1

Я понял ответ. Раньше в контроллере у меня было:

before { sign_in user } 

Однако, в спецификации контроллера Capybara следует отключить. Таким образом, использование:

before { sign_in user, no_capybara: true } 

заставило его работать.

Я понимаю, почему это работает, но недостаточно, чтобы объяснить это. Если у кого есть хорошее объяснение, это было бы здорово! :)

Смежные вопросы