2016-02-03 2 views
1

У меня есть вспомогательный метод, который возвращает одну ссылку if user_signed_in?. Я использую Devise 2.2.8, Rails 3.2.2 и Rspec 3.4.0.rspec helper user_signed_in?

application_helper.rb

def session_button 
    if user_signed_in? 
    link_to "Restricted Area", user_index_path 
    else 
    link_to "Login", new_user_session_path 
    end 
end 

И мой тест:

application_helper_spec.rb

describe "#session_button" do 
    context "user signed in" do 
    login_user 

    it "returns a link to Restricted Area" do 
     expect(session_button).to include "Área Restrita" 
     expect(session_button).to include user_index_path 
    end 
    end 

    context "user not signed in" do 
    it "returns a link to New Session" do 
     expect(session_button).to include "Login" 
     expect(session_button).to include new_user_session_path 
    end 
    end 
end 

login_user макрос включен в моих тестах. Я также загрузил TestHelpers.

RSpec.configure do |config| 
    config.include Devise::TestHelpers, type: :helper 
    config.extend ControllerMacros, :type => :helper 
end 

Проблема: Я получаю эту ошибку:

1) ApplicationHelper#session_button user signed in returns a link to Restricted Area 
    Failure/Error: if user_signed_in? 

    NoMethodError: 
    undefined method `user_signed_in?' for #<RSpec::ExampleGroups::ApplicationHelper::SessionButton::UserSignedIn:0x0000000795a608> 

Я также попытался окурок метод

allow(helper).to receive(:user_signed_in?).and_return(true) 

но я получаю ту же ошибку.

Как мне заглушить этот помощник?

+0

ли эта работа, когда вы запустите его в браузере? т.е. это ошибка в коде или только в тесте? –

+0

Да, он работает в браузере. Ошибка только в тесте ... –

ответ

1

Я нашел способ с помощью анонимного помощника, но я не знаю, если есть лучший способ ...

RSpec.describe ApplicationHelper, :type => :helper do 
    helper do 
    def user_signed_in? 
     user.present? 
    end 
    end 

    describe "#session_button" do 
    context "user signed in" do 
     let(:user) { FactoryGirl.create :user } 

     it "returns a link to Restricted Area" do 
     expect(session_button).to include "Área Restrita" 
     expect(session_button).to include user_index_path 
     end 
    end 

    context "user not signed in" do 
     let(:user) { nil } 

     it "returns a link to New Session" do 
     expect(session_button).to include "Login" 
     expect(session_button).to include new_user_session_path 
     end 
    end 
    end 
end 
Смежные вопросы