2015-09-07 5 views
0

У меня есть декоратор, который получает контроллер приложения как переменную, чтобы получить доступ к переменным сеанса. Что-то вроде:Rails Проверка сеанса сеанса Rspec в декораторе

navigation = NavigationDecorator(user_id, self) 

Самостоятельное применение Контроль.

Все работает отлично, но теперь я должен проверить это и в Rspec я

navigation = NavigationDecorator(user_id, ApplicationController.new) 

Во время моих тестов я получаю:

ActionController::Metal#session delegated to @_request.session, but @_request is nil: #<ApplicationController:0x000000161363f0 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil> 

Обновление:

Я использую его как это:

def initialize(user, controller) 
    @controller = controller 
    ... 
end 

def retrieve_user_id 
    user_id = @controller.session[:temporary_id] if @controller.session[:temporary_id] 
    super 
end 
+0

Не могли бы вы показать код NavigationDecorator? Как вы используете ApplicationController? –

+0

Привет @SheinAlexey! Я обновил свой вопрос – Guido

ответ

1

Я бы предложил, чтобы контроллер-заглушка тестировался, потому что, поскольку вы пишете блок-тест (вы пишете блок-тест, верно?), Вы хотите изолировать тестируемую систему (NavigationDecorator) от ее зависимостей (контроллера). Вы можете написать этот тест:

describe NavigationDecorator do 
    context 'user_id' 
    it 'should take id from session' do 
     session = { temporary_id: 'temporary' } 
     controller = instance_double('ApplicationController', session: session) 
     user = instance_double('User', id: 'user_id') 
     subject = described_class.new(user, session) 
     expect(subject.retrieve_user_id).to eq session[:temporary_id] 
    end 
    end 
end 

тест показывает нам, что у нас есть ненужная зависимость (контроллер), и было бы чище пройти сеанс сразу (если вы можете, конечно):

describe NavigationDecorator do 
    context 'user_id' 
    it 'should take id from session' do 
     session = { temporary_id: 'temporary' } 
     subject = described_class.new('local id', session) 
     expect(subject.retrieve_user_id).to eq session[:temporary_id] 
    end 

    it 'should take id from user when session is empty' do 
     controller = instance_double('ApplicationController', session: {}) 
     user = instance_double('User', id: 'user_id') 
     subject = described_class.new(user, session) 
     expect(subject.retrieve_user_id).to eq user.id 
    end 
    end 
end 
+0

Спасибо большое! С вашим ответом я смог решить свою проблему. Только один быстрый вопрос. В случае, если мой декоратор также установит переменную sesion, как я мог бы выполнить это, не переустанавливая сеанс и не создавая декоратор? – Guido

+0

Не могли бы вы привести пример, я не совсем понимаю, почему вам нужно сбросить сеанс? –

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